1. 程式人生 > >排序算法——堆排序

排序算法——堆排序

調整 wap nbsp 開始 eap code 代碼實現 模擬 while

堆排序

  ①了解二叉堆的定義   ②一般用數組表示堆 註意邏輯存儲結構和實際存儲結構   ③i節點的     父節點(i-1)/2 子節點 左2*i+1 右2*i+2   ④註意每種操作的思想   ⑤一般數組要堆化操作後再進行堆排序
代碼實現
/*本栗子是最小堆*/
/*
從第i個節開始調整*/ void MinHeapDown(int a[],int i,int n) { int j=0,temp=0; temp = a[i]; j=2*i+1;/*i節點的左孩子*/ while(j < n) { if(j+1<n && a[j+1
]<a[j])/*在左右孩子中找最小的來替換父節點i*/ j++; if(a[j] >= temp)/*父節點小於任何一個孩子*/ break; a[i] = a[j];/*將較小的節點往上移,替換父節點*/ i = j; j = 2*i+1; } a[i] = temp; } /*由於堆也是用數組模擬的,故堆化數組後,第一次將A[0]與A[n - 1]交換,再對A[0…n-2]重新恢復堆。 第二次將A[0]與A[n – 2]交換,再對A[0…n - 3]重新恢復堆,重復這樣的操作直到A[0]與A[1]交換。 由於每次都是將最小的數據並入到後面的有序區間,故操作完成後整個數組就有序了
*/ void HeapSort(int a[],int n) { int i=0; for(i=n/2-1;i>=0;i--)/*堆化數組(最小堆)*/ MinHeapDown(a,i,n); for(i=n-1;i>0;i--) { Swap(a[0],a[i]);/*將最小的數調到最後 循環一次後相當於刪除了排在最後的最小值*/ MinHeapDown(a,0,i);/*從根節點0從上往下調整到i*/ } }

排序算法——堆排序