歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 【算法導論】C++實現堆排序

【算法導論】C++實現堆排序

日期:2017/3/1 10:08:33   编辑:Linux編程

堆排序的過程就不說明了,代碼如下:

  1. void Build_Max_Heap(int array_list[] ,const int array_size,const int index);
  2. bool HeapSort(int array_list[],const int array_size);
  3. int main()
  4. {
  5. const int size = 10;
  6. int array_list [] ={16,14,10,8,7,9,3,2,4,1};
  7. HeapSort(array_list,size);
  8. return 0;
  9. }
  10. bool HeapSort(int array_list[],const int array_size)
  11. {
  12. if(array_size < 0)
  13. {
  14. return false;
  15. }
  16. for(int i=0;i<array_size;i++)
  17. {
  18. for(int j = ((array_size - i)/2-1);j>=0;j--)
  19. {
  20. Build_Max_Heap(array_list,array_size - i,j);
  21. }
  22. int tmp = array_list[0];
  23. array_list[0] = array_list[array_size -1 - i];
  24. array_list[array_size -1 - i] = tmp;
  25. std::cout<<"Sorted:"<<i+1<<"\t";
  26. for(int i=0;i<array_size;i++)
  27. {
  28. std::cout<<array_list[i]<<"\t";
  29. }
  30. std::cout<<std::endl;
  31. }
  32. return true;
  33. }
  34. /*構建大根堆*/
  35. void Build_Max_Heap(int array_list[] ,const int array_size,const int index)
  36. {
  37. int left_index = 2*index + 1;
  38. int right_index = 2*index + 2;
  39. int largest = index;
  40. if((right_index < array_size) )
  41. {/*在建立大根堆時,如果父節點比兩個子節點都小,則交換最大的一個子節點*/
  42. if((array_list[left_index] < array_list[right_index]))
  43. {
  44. largest = right_index;
  45. }
  46. else
  47. {
  48. largest = left_index;
  49. }
  50. }
  51. else
  52. {
  53. if(left_index < array_size)
  54. {
  55. largest = left_index;
  56. }
  57. }
  58. if((array_list[index] < array_list[largest]) && (largest != index))
  59. {
  60. int tmp = array_list[index];
  61. array_list[index] = array_list[largest];
  62. array_list[largest] = tmp;
  63. /*如果交換了某個節點的值,則需要遞歸交換其子樹的節點*/
  64. Build_Max_Heap(array_list,array_size,largest);
  65. }
  66. }
Copyright © Linux教程網 All Rights Reserved