1. 程式人生 > >c 堆排序

c 堆排序

sdn oid 二叉 term 它的 pri roc src start

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //堆調整,構建大頂堆,arr[]是待調整的數組,i是待調整的數組
  4. //元素的位置,length是數組的長度
  5. void HeapAdjust(int arr[], int i, int length)
  6. {
  7. int Child;
  8. int temp;
  9. for(;2 * i + 1 < length; i = Child)
  10. {
  11. //子節點的位置 = 2 * (parent(父結點)) + 1
  12. Child = 2 * i + 1;
  13. //得到子結點中較大的結點
  14. if(Child < length - 1 && arr[Child + 1] > arr[Child])
  15. ++Child;
  16. //如果較大的子結點大於父結點那麽把較大的子結點往上移動
  17. //替換它的父結點
  18. if(arr[i] < arr[Child])
  19. {
  20. temp = arr[i];
  21. arr[i] = arr[Child];
  22. arr[Child] = temp;
  23. }
  24. else
  25. break;
  26. }
  27. }
  28. //堆排序算法
  29. void HeapSort(int arr[], int length)
  30. {
  31. int i;
  32. //調整序列的前半部分元素,調整完之後第一個元素
  33. //是序列的最大元素,length/2-1是最後一個非葉子結點
  34. for(i = length/2 - 1; i >= 0; --i)
  35. HeapAdjust(arr, i, length);
  36. //從最後一個元素開始對序列進行調整,不斷的縮小調整
  37. //的範圍直到第一個元素
  38. //循環裏是把第一個元素和當前的最後一個元素交換
  39. //保證當前的最後一個位置的元素是現在這個序列的最大的
  40. //不斷的縮小調整heap的範圍,每一次調整完畢保證第一個
  41. //元素是當前序列的最大的元素
  42. for(i = length - 1; i > 0; --i)
  43. {
  44. arr[i] = arr[0]^arr[i];
  45. arr[0] = arr[0]^arr[i];
  46. arr[i] = arr[0]^arr[i];
  47. HeapAdjust(arr, 0, i); //遞歸調整
  48. }
  49. }
  50. int main()
  51. {
  52. int i;
  53. int num[] = {98, 48, 777, 63, 57, 433, 23, 1112, 1};
  54. printf("==================堆排序==============\n");
  55. printf("實質上是一顆完全二叉樹,利用樹的根結點\n與子節點的性質進行排序\n");
  56. printf("======================================\n\n");
  57. printf("待排序的數據是:\n");
  58. for(i = 0; i < sizeof(num)/sizeof(int); i++)
  59. {
  60. printf("%d ", num[i]);
  61. }
  62. printf("\n");
  63. HeapSort(num, sizeof(num)/sizeof(int));
  64. printf("排序後的數據是:\n");
  65. for(i = 0; i < sizeof(num)/sizeof(int); i++)
  66. {
  67. printf("%d ", num[i]);
  68. }
  69. printf("\n");
  70. return 0;
  71. }


技術分享

c 堆排序