堆排序
说白了,也就是大堆,或者小堆,通过删掉堆顶点,然后存入数组,来实现排序:
第一阶段:构建堆最多用2N次比较
第二阶段:第i次deleteMax最多用到2【logi】次比较,
总数最多2NlogN-O(N)次比较
代码:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 template <typename Comparable> 5 void heapsort(vector<Comparable> & a) 6 { 7 for(int i = a.size()/2; i>= 0 ;i--) 8 percDown(a,i,a.size()); 9 for(int j=a.size()-1; j>0 ; j--) 10 { 11 swap(a[0],a[j]); 12 percDown(a,0,j); 13 } 14 } 15 inline int leftChild(int i ) 16 { 17 return 2*i; 18 } 19 template <typename Comparable> 20 void percDown(vector<Comparable> & a,int i,int n) 21 { 22 int child; 23 Comparable tmp; 24 25 for(tmp = a[i] ; leftChild(i)<n ; i=child) 26 { 27 child = leftChild(i); 28 if(child != n-1 && a[child] < a[child+1]) 29 child++; 30 if(tmp<a[child]) 31 a[i]=a[child]; 32 else 33 break; 34 } 35 a[i]=tmp; 36 } 37 int main() 38 { 39 vector<int> ivec; 40 ivec.push_back(1); 41 ivec.push_back(9); 42 ivec.push_back(2); 43 ivec.push_back(10); 44 ivec.push_back(3); 45 ivec.push_back(11); 46 ivec.push_back(4); 47 ivec.push_back(12); 48 ivec.push_back(5); 49 ivec.push_back(13); 50 ivec.push_back(6); 51 ivec.push_back(14); 52 ivec.push_back(7); 53 ivec.push_back(15); 54 ivec.push_back(8); 55 ivec.push_back(16); 56 heapsort(ivec); 57 for(int i =0;i<ivec.size();i++) 58 cout<<ivec[i]<<endl; 59 return 0; 60 }
结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?