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

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

写堆排序的动机

        自从学了堆以来,对于堆用得最多的就是STL的map,set以及优先队列,而最基本的堆构建,堆调整都没有动作做过,趁着找实习的阶段复习一下堆,实现一个堆排序。


 

堆介绍

        堆是一个完全二叉树,也就是说,整棵树除了叶子最底层的叶子节点之外,都是填满的,而最底层的叶子节点由左到右不能有空隙。也就是除了底层,每一层都是满的,底层必须从左到右填数。而最大堆必须满足父节点大于子节点,最小堆则相反。对于堆的插入和删除都是Log(N)的时间复杂度。


 

堆排序思路

       堆排序的思想就是先构建一个最大堆,然后不断对堆进行pop操作,把最大值pop到队列尾部。最大堆最大的特点是”子承父业“。当子节点大于父节点时候,子代替父上一线;当父节点被“提升”时候找到最大的子节点补入,剩下的空缺依次不上,遇到没有后代的时候把最后的数过继过来。由于堆是一个完全二叉树,所以堆有一个很重要的特性,就是节点i的子节点分别是i*2 + 1和i*2+2,所以并不需要真正构建一棵树。


 

代码

#include 
#include
#include
#include
#include
using namespace std;void swap(int &num1,int &num2){ if(num1 != num2){ num1 ^= num2; num2 ^= num1; num1 ^= num2; }}void insert(vector
&arr_sort){ //构建一个最大堆 for(int i = 1;i < arr_sort.size();i ++){ int j = i; while(arr_sort[j] > arr_sort[(j - 1)/ 2]){ swap(arr_sort[j],arr_sort[(j - 1)/2]); j = (j - 1)/2; } }} void pop(vector
&arr_sort){ for(int i = 0;i < arr_sort.size();i ++){ int tmp = arr_sort[0],j = 0; while(j * 2 + 2 <= arr_sort.size() - i - 1){ if(arr_sort[j * 2 + 1] > arr_sort[j * 2 + 2]){ arr_sort[j] = arr_sort[j * 2 + 1]; j = j * 2 + 1; }else{ arr_sort[j] = arr_sort[j * 2 + 2]; j = j * 2 + 2; } } arr_sort[j] = arr_sort[arr_sort.size() - i - 1]; while(arr_sort[j] > arr_sort[(j - 1)/ 2]){ swap(arr_sort[j],arr_sort[(j - 1)/2]); j = (j - 1)/2; } arr_sort[arr_sort.size() - i - 1] = tmp; }}void initVec(vector
&vec) { srand((unsigned)time(NULL)); int len = rand() % 1000; for(int i = 0; i < len; i ++) { vec.push_back(rand() % 1000); }}void heap_sort(vector
&vec) { insert(vec); pop(vec);}void print(vector
vec) { for(int i = 0;i < vec.size();i ++) { cout << vec[i] << " "; } cout << endl;}int main(){ int nums = 10; while(nums --) { vector
arr1; vector
arr2; initVec(arr1); arr2 = arr1; heap_sort(arr1); sort(arr2.begin(), arr2.end()); cout << "the heap_sort result: "; print(arr1); cout << "the correct result: "; print(arr2); for(int i = 0; i < arr1.size(); i ++) { if(arr1[i] != arr2[i]) { cout << "wrong result:" << endl; cout << arr1[i] << " and " << arr2[i] << endl; return 1; } } cout << "correct result!" << endl; } return 0;}
View Code

 

转载于:https://www.cnblogs.com/chruny/p/6497361.html

你可能感兴趣的文章
日常运维(六)
查看>>
使用代码获得Netweaver里某个software component和C4C的版本
查看>>
深入理解Plasma(2):Plasma 细节剖析
查看>>
vue-devtools在Chrom浏览器上的安装
查看>>
全球首款社交用机器人Jibo将走入历史舞台
查看>>
阿里云发布边缘节点服务2.0,建立“融合、开放、联动”的边缘计算新形态
查看>>
提供SaaS Launchkit,快速定制,一云多端等能力,一云多端将通过小程序云实现...
查看>>
[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱?
查看>>
HashTable
查看>>
Index 和Index Type 的区别
查看>>
转换wav为采样率16000的wav
查看>>
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
整合企业架构的技术点
查看>>
Java编程代码性能优化总结
查看>>
深度解析JavaScript事件对象
查看>>
用Python爬取优酷弹幕数据并做成词云,"人"云亦云
查看>>
外企面试,哪有你想象的那么难!(已收埃森哲、NTTDATA等8家外企offer)
查看>>
华为云服务器实战 之 Gitlab安装与配置使用
查看>>
数据库性能测试
查看>>
MongoDB
查看>>