博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【模板】堆排序
阅读量:5144 次
发布时间:2019-06-13

本文共 1404 字,大约阅读时间需要 4 分钟。

【分析:】

n log2 n的排序算法,不稳定,但时间复杂度不会被卡(快排有可能被卡成n2

从小到大排序需要的是大根堆

当堆非空的时候,弹出堆顶元素,维护堆,在堆所用数组的最后存入弹出的堆顶元素

由于维护堆时堆的大小--,所以在堆所用数组的最后存入元素不会影响之后的操作

最后堆所用数组的元素便是从大到小排好的.

 

【代码:】

1 //堆排序 2 #include
3 #include
4 using namespace std; 5 6 const int MAXN = 100000 + 1; 7 8 int n, h_size; 9 int h[MAXN];10 11 inline void swap(int &x, int &y) {12 x ^= y, y ^= x, x ^= y;13 }14 15 void push(int x) {16 h[++h_size] = x;17 int now = h_size, next;18 while(now > 1) {19 next = now >> 1;20 if(h[now] > h[next])21 swap(h[now], h[next]);22 else break;23 now = next;24 }25 }26 int pop() {27 int ret = h[1];28 h[1] = h[h_size--];29 int now = 1, next;30 while((now << 1) <= h_size) {31 next = now << 1;32 if(next < h_size && h[next|1] > h[next]) ++next;33 if(h[now] < h[next])34 swap(h[now], h[next]);35 else break;36 now = next;37 }38 return ret;39 }40 41 void Que_sort() {42 while(h_size) {43 int num = pop();44 h[h_size + 1] = num;45 }46 }47 48 int main() {49 scanf("%d", &n);50 int num;51 for(int i = 1; i <= n; i++) {52 scanf("%d", &num);53 push(num);54 }55 Que_sort();56 for(int i = 1; i <= n; i++)57 printf("%d ", h[i]);58 }

 

转载于:https://www.cnblogs.com/devilk-sjj/p/9024842.html

你可能感兴趣的文章
《软件工程》阅读笔记之一
查看>>
spark视频-Spark 1.0内核探索
查看>>
word2vec——高效word特征提取
查看>>
12.26冲刺
查看>>
js设计模式-桥接模式
查看>>
函数调用方式
查看>>
Android Studio 生成 Xutils3 注入的插件
查看>>
8th week blog 2
查看>>
LeetCode之Add Two Numbers
查看>>
Noj(1070)
查看>>
sql server 由于登入失败而无法启动服务
查看>>
RST_n的问题
查看>>
欢迎来我的#百度相册#时光轴,坐上时光机,与我一起穿梭时空!
查看>>
------结对作业代码复审-----
查看>>
ASP.NET 获得当前网页名字
查看>>
windows pear 安装
查看>>
RabbitMQ安装详解(centos6.8)(转自:http://www.cnblogs.com/zhen-rh/p/6862350.html)
查看>>
hdu 2565 放大的X
查看>>
前缀表达式
查看>>
java基础面试题常出现(一)
查看>>