数据结构-堆(应用篇)之堆排序法-C和C++的实现
堆排序
关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序。
关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/7853649.html
堆排序属于一种选择排序:
步骤如下:
- 把待排序的数据构建成大顶堆(从大到小排序)。
- 把堆顶的数据拿出放在数组的第一个元素中。
- 使用下沉的方法整理堆中的数据。
- 循环第2,3步,直到堆中所有数据都取出来为止。
这个算法的优缺点如下
优点:时间复杂度低,其中建立堆最多循环了nlong2(n)/2次,时间复杂度为O(nlog2(n)),同样后面重新排序的时间复杂度为O(nlong2(n)),所以整个算法的复杂度为O(nlog2(n))。
缺点:需要建堆,操作繁琐。
综上所述,本排序算法适合排列大量数据时使用。
C语言
取出堆顶元素并把它从堆中删除:
bool MaxHeap_getTopAndMoveIt(MaxHeap *heap,MAXHEAP_ELEM *elem) { *elem = heap->iDatas[0]; MaxHeap_pop(heap,0); return true; }
- MaxHeap_pop()函数为从堆中删除某个数。在上一节中讲过这里不再赘述。
堆排序:
bool HeapSort(MAXHEAP_ELEM buff[],int length) { int i; MaxHeap heap={0}; if(length<=0) return false; MaxHeapConstructByBuffer(&heap,buff,10); for(i=0;i<length;i++) { MaxHeap_getTopAndMoveIt(&heap,&buff[i]); } MaxHeapDesturct(&heap); return true; }
- MaxHeapConstrucByBuffer()函数的作用是把buff[]中的数据建立成堆。在上一节中讲过这里不再赘述。
- MaxHeap_getTopAndMoveIt()函数的作用是取出堆顶的元素并放在buff[]的最前边。在堆中,堆顶的的元素为最大值。
测试:
使用堆排序的方法将buffer中的数据从大到小排列:
int main() { int i; int buffer[10]={0,1,2,3,4,5,6,7,8,9}; HeapSort(buffer,10); for(i=0;i<10;i++) { printf("%d ",buffer[i]); } system("pause"); return 0; }
程序运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?