堆排序(下标0/1)

  1. 0   这里的n指的是数组的长度
  2. void SiftHeap(int r[], int k, int n) {    
  3. int i = k;     
  4. int j = 2 * i + 1;  // 置i为要筛的结点,j为i的左孩子    
  5. while (j < n) {  // 筛选还没有进行到叶子    
  6. if (j + 1 < n && r[j] < r[j + 1]) j++;  // 比较i的左右孩子,j为较大者    
  7. if (r[i] >= r[j])  // 根结点已经大于或等于左右孩子中的较大者    
  8. break;    
  9. else {    
  10.             swap(r[i], r[j]);  // 将根结点与结点j交换    
  11.             i = j;     
  12.             j = 2 * i + 1;  // 更新i和j,继续向下筛选    
  13.         }    
  14.     }    
  15. }    
  16. void HeapSort(int r[], int n) {    
  17. // 初始化堆    
  18. for (int i = (n/ 2)-1 ; i >= 0; i--) {    
  19.         SiftHeap(r, i, n);    
  20.     }    
  21. // 排序过程    
  22. for (int i = n - 1; i > 0; i--) {    
  23.         swap(r[0], r[i]);  // 交换堆顶元素(最大值)与最后一个未排序的元素    
  24.         SiftHeap(r, 0, i);  // 调整剩余部分的堆    
  25.     }    

}    

1

  1. void SiftHeap(int r[], int k, int n) {  
  2.     int i = k;   
  3.     int j = 2 * i;  // 置i为要筛的结点,j为i的左孩子  
  4.     while (j <= n) {  // 筛选还没有进行到叶子  
  5.         if (j < n && r[j] < r[j + 1]) j++;  // 比较i的左右孩子,j为较大者  
  6.         if (r[i] >= r[j])  // 根结点已经大于或等于左右孩子中的较大者  
  7.             break;  
  8.         else {  
  9.             swap(r[i], r[j]);  // 将根结点与结点j交换  
  10.             i = j;   
  11.             j = 2 * i;  // 更新i和j,继续向下筛选  
  12.         }  
  13.     }  
  14. }  
  15. void Swap(int &a, int &b) {  
  16.     int temp = a;  
  17.     a = b;  
  18.     b = temp;  
  19. }  
  20.   
  21. void HeapSort(int r[], int n) {  
  22.     // 初始化堆  
  23.     for (int i = n / 2; i >= 1; i--) {  
  24.         SiftHeap(r, i, n);  
  25.     }  
  26.   
  27.     // 排序过程  
  28.     for (int i = n; i > 1; i--) {  
  29.         Swap(r[1], r[i]);  // 交换堆顶元素(最大值)与最后一个未排序的元素  
  30.         SiftHeap(r, 1, i - 1);  // 调整剩余部分的堆  
  31.     }  
  32. }  
posted @ 2024-11-30 22:20  泥薯  阅读(26)  评论(0)    收藏  举报