(详细)实现推排序

news/2024/5/19 4:28:56 标签: c语言, 算法, 堆排序, c++

题目

在这里插入图片描述

应知必会

在这里插入图片描述

堆排序的重点,就是down(),up()函数

void down(int u){
    int min = u;
    if(u * 2 <= size && h[u * 2] < h[min]) min = u * 2;
    if(u * 2 + 1 <= size && h[u * 2 + 1] < h[min]) min = u * 2 + 1;
    if(u != min){
        int t = h[min];
        h[min] = h[u];
        h[u] = t;
        down(min);
    }
}

在这里插入图片描述

up()较为简单

void up(int u){
    while(u / 2 && h[u / 2] > h[u]){
        int t = h[u / 2];
        h[u / 2] = h[u];
        h[u] = t;
        u /= 2;
    }
}

完整代码

#include<stdio.h>
#define N 100010

int h[N],size;

void down(int u){
    int min = u;
    if(u * 2 <= size && h[u * 2] < h[min]) min = u * 2;
    if(u * 2 + 1 <= size && h[u * 2 + 1] < h[min]) min = u * 2 + 1;
    if(u != min){
        int t = h[min];
        h[min] = h[u];
        h[u] = t;
    
        down(min);
    }
}
void up(int u){
    while(u / 2 && h[u / 2] > h[u]){
        int t = h[u / 2];
        h[u / 2] = h[u];
        h[u] = t;
        u /= 2;
    }
}

int main(){
    int n,m;scanf("%d%d",&n,&m);
    
    size = n;//不要忘记
    
    for(int i = 1;i <= n;i ++ ) scanf("%d",&h[i]);//为了方便(左右儿子的计算),从1开始
    
    for(int i = n / 2;i;i -- ) down(i);//堆排序
    while(m -- ){
        printf("%d ",h[1]);//头节点即最小值
        h[1] = h[size -- ];//删除堆顶(用最后一个数覆盖第一个数) 并且长度减1
        down(1);//让覆盖好的数往下面走,确保头节点是最小值
    }
    return 0;
}

http://www.niftyadmin.cn/n/1326953.html

相关文章

判断大小端字节序

大端模式&#xff08;大端字节序&#xff09;&#xff1a; 是指数据的低位保存在内存的高地址中&#xff0c;而数据的高位&#xff0c;保 存在内存的低地址中 小端模式&#xff08;小端字节序&#xff09;&#xff1a; 是指数据的低位保存在内存的低地址中&#xff0c;而数据的…

力扣1.两数之和

解法一&#xff1a;暴力做法&#xff0c;两层for循环,遍历所有情况看相加是否等于⽬标和。 class Solution {public int[] twoSum(int[] nums, int target) {for(int i 0;i < nums.length;i ){for(int j i 1;j < nums.length;j ){if(nums[i] nums[j] target) retu…

(Java)编译型解释性语言

举一个通俗的例子&#xff1a; 一个外国人要看一本中国小说&#xff0c;他可以有两种方法&#xff1a;1.&#xff08;编译型&#xff09;直接买一本全部翻译完的书。 2.&#xff08;翻译型&#xff09;找一个翻译&#xff0c;外国人要看一段&#xff0c;就给他翻译一段。 一、编…

模拟散列表

#include<stdio.h> #include<string.h> #define N 200003 #define null 0x3f3f3f3f //定义nullint h[N]; //find函数来找坑位 int find(int x){int k (x % N N ) % N;//离散化//找坑位&#xff08;坑位不能有其他人&#xff0c;或者坑位就是自己&#xff0c;那么…

redis(4.0.10版本)哨兵、redis cluster集群部署、原理、测试

目录 一、哨兵原理 二、准备环境 1.准备2台服务器&#xff0c;修改主机名称192.168.1.134&#xff08;redis-master&#xff09;、 192.168.1.135&#xff08;redis-slave&#xff09;&#xff0c;关闭防火墙 2.下载依赖包、获取redis-4.0.10.tar包 3.redis文件精简 4.系统…

普通大一学生的自我反思

&#xff08;更精确的&#xff09;个人反思&#xff08;2021.11.12&#xff09; 个人经历 &#xff08;正式开始学习大概在2021-8月份左右&#xff08;笔记本电脑到货的那个时间点&#xff09;&#xff0c;开始学习C语言&#xff0c;C语言看了好几个视频&#xff0c;主要看的是…

用户登录业务简易实现(IDEAJava实现)(练习JDBC)

使用IDEA开发JDBC代码配置驱动 注&#xff1a;1.提前下载好jar包 ​ 2.不是配置一次就行了&#xff0c;每次新建一个模块&#xff0c;都需要再次配置。 创建一个数据库&#xff0c;模拟一个用户信息表。 create database userdata; create table t_user(username varchar(255…

SQL注入问题的解决(PreparedStatement)

sql注入的问题 上篇博客用户登录业务简易实现结尾提到了代码的不足&#xff1a;存在SQL注入问题。 下面演示一下什么是SQL&#xff0c;注入问题。&#xff08;就拿上篇的代码举个例子&#xff09; 以上为正常现象&#xff0c;但有些“不法分子”抓住了代码的漏洞&#xff0c;干…