博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序(heapsort)
阅读量:4596 次
发布时间:2019-06-09

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

一. 堆排序

堆排序是利用最大堆的性质进行的选择排序. 堆排序具有如下特点:

1) 时间复杂度O(nlogn)

2) 原址排序(就地排序): 在排序时把原序列分为堆区和非堆区两个区域, 堆区在前. 每次从堆区弹出一个元素并和非堆区的第一个元素交换, 直至堆区消失.

3) 不稳定排序

堆排序很简单, 所需的操作有:

1: void heapsort(vector
& src);
2: inline int left(int i) { return (i << 1) + 1; }
3: void adjustDown(vector
& src, int id, int heapsize);

二. 堆排序的过程

1. 节点的下沉操作

1: void adjustDown(vector
& src, int id, int heapsize)
2: {
3: 	int child;
4:
5: 	for (; left(id) < heapsize; id = child)
6: 	{
7: 		// 找出最小的子结点
8: 		child = left(id);
9: 		if (child < heapsize - 1 && src[child] < src[child + 1])
10: 			++child;
11: 		// 如果父节点比子结点还小, 就让父节点下沉
12: 		if (src[id] < src[child])
13: 			swap(src[id], src[child]);
14: 		else break;
15: 	}
16: }

2. 原址建堆和弹堆操作

void heapsort(vector
& src){ // 原址建堆. 把整个数组变成堆 for (int i = (src.size() >> 1) - 1; i >= 0; --i) { adjustDown(src, i, src.size()); } // 弹出最大元素, 交换到堆区末尾(非堆区第一个元素) for (int j = src.size() - 1; j > 0; --j) { swap(src[0], src[j]); //deleteMax adjustDown(src, 0, j); }}

 

转载于:https://www.cnblogs.com/roy-mustango/p/4220379.html

你可能感兴趣的文章
python连接zookeeper的日志问题
查看>>
pycharm上传代码到码云错误现象用户密码
查看>>
柔性数组-读《深度探索C++对象模型》有感
查看>>
rmdir 命令(转)
查看>>
生产者消费者
查看>>
Contos 安装Tomcat
查看>>
Python编程Day3—基本运算符、数据类型
查看>>
在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll
查看>>
How to get AutoCAD Mtext content
查看>>
程序员技术练级攻略
查看>>
Java开发微信公众号
查看>>
【C语言】给一组组数,仅仅有两个数仅仅出现了一次,其它全部数都是成对出现的,找出这两个数。...
查看>>
CAF(C++ actor framework)(序列化之复杂类,分析 还有自己不懂的细思恐极函数实现)(三)...
查看>>
18.5.19 自测
查看>>
决策树(Decision Trees)
查看>>
为什么Java字符串是不可变对象?
查看>>
最近挖的坑
查看>>
python-变量
查看>>
MD5-总结
查看>>
Linq to Entity 时间差作为筛选条件产生的问题
查看>>