博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HeapSort 堆排序
阅读量:4097 次
发布时间:2019-05-25

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

堆排序算法

思路:
先将序列构成一个大顶堆,然后将将第一个元素和剩余大顶堆的最后一个元素调换,然后将然后元素数再-1,再将剩下的调整为大顶堆,一直循环,具体思路见代码注释。

注:堆排序的时间复杂度为O(nlogn),性能上远远好过于冒泡、简单选择、直接插入排序,但是由于记录的比较与交换是跳跃式的,因此堆排序是一种不稳定的排序方法。

代码实现:

//堆排序(排序后为从小到大)#include 
#include
using namespace std; void HeapAjust(int (&a)[9], int s, int m){ int tmp, j; tmp = a[s];//记录此时的结点s for (j = 2 * s; j <= m; j *= 2){
//如果它不是根结点,即如果(j=2*s)<=m满足 if (j < m&&a[j] < a[j + 1]){
//如果它有右子树且右子树的值大,++j ++j; } if (tmp >= a[j]){
//如果刚开始的结点s的值比这个大,就不执行 break; } a[s] = a[j];//否则,就将结点s的值和结点j的值进行调换 s = j; } a[s] = tmp;}void HeapSort(int (&a)[9]){
//数组作为引用形参传入,使用在此修改对原数组也有效 int asize = sizeof(a) / sizeof(a[0]);//取数组的大小 int i; for (i = asize / 2-1; i >= 0; --i){
//先这个序列调整为大顶堆 HeapAjust(a, i, asize-2); } for (i = asize - 1; i > 0; --i){ swap(a[0], a[i]);//将第一个元素和剩余大顶堆的最后一个元素调换 HeapAjust(a, 0, i - 1);//将然后元素数再-1,然后再将剩下的调整为大顶堆 }}int main(){ int a[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 }; cout << "before sorted:" << endl; for (size_t i = 0; i < 9; ++i){
//输出 cout << a[i] << " "; } cout << endl; HeapSort(a); cout << "after sorted:" << endl; for (size_t i = 0; i < 9; ++i){
//输出 cout << a[i] << " "; } cout << endl; return 0;}

运行结果:

这里写图片描述

你可能感兴趣的文章
FTP 常见问题
查看>>
shell 快捷键
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
No devices detected. Fatal server error: no screens found
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
谈谈加密和混淆吧[转]
查看>>
乘法逆元
查看>>
Objective-C 基础入门(一)
查看>>
Linux系统中的美
查看>>
一些实战项目(linux应用层编程,多线程编程,网络编程)
查看>>
STM32CubeMX 真的不要太好用
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>