heap_sort 骑猪看日落 2024-04-18 22:50 67阅读 0赞 堆排序是利用堆来进行排序。 堆的定义:n个元素的序列(a1,a2...an)当且仅当满足下面关系时,称为堆。 (a(i)<=a(2\*i) && a(i)<=a(2\*i+1))或者(a(i)>=a(2\*i) && a(i)>=a(2\*i+1))其中,2\*i+1<=n。 堆的模型:可以借助完全二叉树来理解。每一节点的值均不大于或不小于其左右孩子节点的值。 代码如下: **\[cpp\]** [ view plain][view plain] [copy][view plain] [print][view plain] [?][view plain] 1. \#include<iostream> 2. using namespace std; 3. 4. void shift(int a\[\],int k,int m) //调整堆,以k为根,m个数据 5. \{ 6. int i,j,tem; 7. bool finished; 8. 9. tem=a\[k\]; 10. finished=false; 11. i=k; 12. j=2\*i; 13. 14. while(j<=m && finished==false) 15. \{ 16. if(j<m && a\[j\]<a\[j+1\]) //左右孩子的大值用j指示 17. j++; 18. 19. if(tem>=a\[j\]) 20. finished=true; 21. else 22. \{ 23. a\[i\]=a\[j\]; 24. i=j; 25. j\*=2; 26. \} 27. \} 28. 29. a\[i\]=tem; 30. \} 31. 32. void heap\_sort(int a\[\],int n) 33. \{ 34. int i,tem; 35. 36. for(i=n/2;i>=1;i--) //初始建堆 37. shift(a,i,n); 38. 39. for(i=n;i>=2;i--) 40. \{ 41. tem=a\[1\]; //输出大数到数组尾部 42. a\[1\]=a\[i\]; 43. a\[i\]=tem; 44. 45. shift(a,1,i-1); //调整堆 46. \} 47. \} 48. 49. int main() 50. \{ 51. int i,n,a\[101\]; 52. 53. while(cin>>n,n) 54. \{ 55. for(i=1;i<=n;i++) //注意:存放有用数据下标从1开始,建堆需要 56. cin>>a\[i\]; 57. 58. heap\_sort(a,n); 59. 60. for(i=1;i<=n;i++) 61. cout<<a\[i\]<<" "; 62. cout<<endl<<endl; 63. \} 64. 65. return 0; 66. \} #include<iostream> using namespace std; void shift(int a[],int k,int m) //调整堆,以k为根,m个数据 { int i,j,tem; bool finished; tem=a[k]; finished=false; i=k; j=2*i; while(j<=m && finished==false) { if(j<m && a[j]<a[j+1]) //左右孩子的大值用j指示 j++; if(tem>=a[j]) finished=true; else { a[i]=a[j]; i=j; j*=2; } } a[i]=tem; } void heap_sort(int a[],int n) { int i,tem; for(i=n/2;i>=1;i--) //初始建堆 shift(a,i,n); for(i=n;i>=2;i--) { tem=a[1]; //输出大数到数组尾部 a[1]=a[i]; a[i]=tem; shift(a,1,i-1); //调整堆 } } int main() { int i,n,a[101]; while(cin>>n,n) { for(i=1;i<=n;i++) //注意:存放有用数据下标从1开始,建堆需要 cin>>a[i]; heap_sort(a,n); for(i=1;i<=n;i++) cout<<a[i]<<" "; cout<<endl<<endl; } return 0; } Attention: ①时间复杂度为O(nlog2n),空间复杂度为O(n)。 ②属于原地排序。 [view plain]: http://blog.csdn.net/lulipeng_cpp/article/details/7467736#
相关 堆排序(heapsort) 堆排序(heapsort) Heap Sort 1. Complete Binary Tree 2. parent > children heapify n = 布满荆棘的人生/ 2023年10月09日 10:32/ 0 赞/ 52 阅读
相关 算法-排序算法:堆排序(HeapSort )【O(nlogn)】 MyArray.java / 数组 @author @version 2018/8/4 / publ 阳光穿透心脏的1/2处/ 2023年10月04日 12:30/ 0 赞/ 24 阅读
相关 JavaScript实现heapsort堆排序算法(附完整源码) JavaScript实现heapsort堆排序算法(附完整源码) Heap.js完整源代码 MinHeap.js完整源代码 Comparator.js完 蔚落/ 2022年09月07日 09:55/ 0 赞/ 190 阅读
相关 【数据结构】中的堆(HeapSort)排序 堆排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序利用了大根堆(或小根堆)堆顶记录的关键 男娘i/ 2022年06月16日 11:44/ 0 赞/ 216 阅读
相关 堆(heapsort)的有关概念 关于堆的一些基本概念 1. 堆:你可以把他看成是一个数组,近似的看成一个完全的二叉树,从二叉树顶端开始,从上到下,从左到右,按这个顺序的值组成了数组里的值。 2. 最 刺骨的言语ヽ痛彻心扉/ 2022年06月09日 04:25/ 0 赞/ 215 阅读
相关 Heapsort 堆排序:堆排序就是利用堆这种数据结构的性质来对数组进行排序,在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的性质可知,最大的值一定在堆顶。堆排序一种不稳定的排序算法 ゞ 浴缸里的玫瑰/ 2022年06月02日 03:48/ 0 赞/ 130 阅读
相关 排序算法7:堆排序(HeapSort) 排序算法7:堆排序(HeapSort) 文章目录 排序算法7:堆排序(HeapSort) 前言 1. 算法步骤 2. 动图演示 2、实 淩亂°似流年/ 2021年09月28日 22:38/ 0 赞/ 383 阅读
相关 选择排序之堆排序(HeapSort) [图解排序算法(三)之堆排序][Link 1] 一、堆定义 (二叉)堆是一个数组,类似于完全二叉树。分为两种形式: ![这里写图片描述][2016092622414 谁借莪1个温暖的怀抱¢/ 2021年06月10日 20:41/ 0 赞/ 489 阅读
还没有评论,来说两句吧...