堆排序
问题:对可以分为大顶堆和小顶堆。
大顶堆满足父节点大于左右孩子节点:父节点i,则i>2*i ;i>2*i+1;
小顶堆满足父节点小于左右孩子节点:父节点i,则i<2*i ;i<2*i+1;
指针问题,在交换两个变量时,确保交换,要用指针。
下面代码是小顶堆排序。
代码:
#include <iostream> using namespace std; void buildHeap( int arr[], int length) //建立堆 { int i; int *min; int *temp; int t; int f; int k; int flag; int n=length/2; for (i=n;i>0;i--) { f=i; while (2*f<=length) //循环向下判断 { temp=&arr[f-1]; min=&arr[2*f-1]; flag=2*f; if (2*f+1<=length) { if (arr[2*f]<*min) //选择孩子节点中较小的节点 { min=&arr[2*f]; flag=2*f+1; } } if (*min<*temp) //父节点小于孩子节点,则交换 { // cout<<*temp<<":"<<*min<<"--"; t=*temp; *temp=*min; *min=t; f=flag; // cout<<flag<<"--"; } else break ; } } } void heapSort( int arr[], int length) // 堆排序 { buildHeap(arr,length); cout<<arr[0]<< " " ; arr[0]=arr[length-1]; } int main() { int arr[10]={9,3,5,1,2,0,4,8,6,7}; int i,j; cout<< "排序前:" <<endl; for (i=0;i<10;i++) { cout<<arr[i]<< " " ; } cout<<endl; cout<< "堆排序后:" <<endl; for (j=10;j>0;j--) { heapSort(arr,j); } cout<<endl; return 0; } |
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述