C++实现堆排序

x33g5p2x  于2021-09-24 转载在 C/C++  
字(0.9k)|赞(0)|评价(0)|浏览(420)
  1. #include<iostream>
  2. using namespace std;
  3. void HeapAdjust(int arry[], int i, int size) //大小为size的数组arry,将其中以位置i为根节点的子树转换为小根堆
  4. {
  5. for(int j=2*i+1; j<size; j=j*2+1) //将i结点的数据与其左右孩子比较,若其小于左右孩子,则与左右孩子中的较小值交换
  6. {
  7. int x = arry[i];
  8. if(j+1<size&&(x>arry[j]||x>arry[j+1])) //若右孩子存在
  9. {
  10. if(arry[j]<=arry[j+1])
  11. {
  12. arry[i] = arry[j];
  13. arry[j] = x;
  14. }
  15. else
  16. {
  17. arry[i] = arry[j+1];
  18. arry[j+1] = x;
  19. j++;
  20. }
  21. i = j;
  22. }
  23. else if(j+1==size&&x>arry[j]) //若右孩子不存在
  24. {
  25. arry[i] = arry[j];
  26. arry[j] = x;
  27. i = j; //交换后继续将以结点i为根节点的子树转换为小根堆
  28. }
  29. else
  30. {
  31. break;
  32. }
  33. }
  34. }
  35. void HeapSort(int arry[], int size) //堆排序
  36. {
  37. for(int i=size/2-1; i>=0; --i) //对所有非叶子结点进行小根堆化,使得整个数组成为一个小根堆
  38. {
  39. HeapAdjust(arry,i,size);
  40. }
  41. for(int i=size-1; i>0; --i)
  42. {
  43. int t = arry[0]; //将新构造的小根堆的根交换到数组的末尾,
  44. arry[0] = arry[i];
  45. arry[i] = t;
  46. HeapAdjust(arry,0,i); //用数组的前i个数据继续构造新的小根堆
  47. }
  48. }
  49. int main()
  50. {
  51. int a[] = {81,94,11,96,12,35,17,95,28,58,41,75,15};
  52. HeapSort(a,13);
  53. for(int i=0; i<13; ++i)
  54. {
  55. cout << a[i] << " ";
  56. }
  57. }

相关文章

最新文章

更多