heap排序法使用heap tree(堆積樹),樹是一種資料結構,而堆積樹是乙個二元樹,也就是每乙個父節點最多只有兩個子節點(關於樹的詳細定義還請見資料結構書籍),堆積樹的 父節點
若小於子節點,則稱之為最小堆積(min heap ),父節點若大於子節點,則稱之為最大堆積( max heap),而同一層的子節點則無需理會其大小關係,例如下面就是乙個堆積樹:
我們可以用陣列來儲存堆積樹的所有元素和順序,索引我們定為從1開始,把左節點的索引記為s,則右節點為s+1,父節點為s/2,
就如上圖所示,將上圖的堆積樹轉換為一維陣列之後如下所示:
首先必須知道如何建立堆積樹,加至堆積樹的元素會先放置在最後乙個樹葉節點位置,然後檢查父節點是否小於子節點(最小堆積),將小的元素不斷與父節點交換,直到滿足堆積樹的條件
為止,例如在上圖的堆積加入乙個元素12,則堆積樹的調整方式如下所示:
建立好堆積樹之後,樹根一定是所有元素的最小值,再將最小值取出,然後調整數為堆積樹。
不斷重複以上的步驟,就可以達到排序的效果,最小值的取出方式是將樹根與最後乙個樹葉節點交換,然後切下樹葉節點,重新調整樹為堆積樹,如下所示:
調整完畢後,樹根節點又是最小值了,於是我們可以重複這個步驟,再取出最小值,並調整樹為堆積樹,如下所示:
如此重複步驟之後,由於使用一維陣列來儲存堆積樹,每一次將樹葉與樹根交換的動作就是將最小值放至後端的陣列,所以最後陣列就是變為已排序的狀態。
#include
#include
#define max 10
void swap(int &a, int &b)
void creat_heap(int *number)
; int i, j;
int s, p;
for (i = 1; i < max + 1; i++)
}for (i = 1; i < max + 1; i++)
//printf("%d ", num[i]);
number[i] = heap[i];
}void heap_sort(int *number)
swap(number[p], number[s]);
p = s; //重新定義父節點
s = 2 * p; //父節點p的左子節點}}
for (int i = max; i > 0; i--)
printf("%d ", number[i]);
}int main()
; creat_heap(num);
heap_sort(num);
system("pause");
return
0;}
shaker 排序法 改良的氣泡排序 C
include include shaker 排序法 改良的氣泡排序 採用雙向進行 先讓氣泡排序由左向右進行,再來讓氣泡排序由右往左進行 如此完成一次排序的動作,而您必須使用left與right兩個旗標來記錄左右兩端已排序的元素位置。如 乙個排序的例子如下所示 排序前 45 1977 8113 28...
C 氣泡排序法 插入排序法 選擇排序法
是陣列等線性排列的數字從大到小或從小到大排序。以從小到大排序為例。資料 11,35,39,30,7,36,22,13,1,38,26,18,12,5,45,32,6,21,42,23 使用 陣列 int array 儲存數字。過程 陣列從小到大排序 思路迴圈都把最大的數放在最後一位,無序數字個數減1...
排序法之選擇排序法
首先通過陣列中元素的比較方式來分析 用陣列中第乙個角標的元素與陣列中第二個角標的元素進行比較,發現9比6大,進行位置置換,此處應該定義乙個三方變數,用來記錄住置換過程的元素值,然後再用第乙個角標的元素與下乙個角標元素進行比較,按照全面的原則進行置換位置,如果前者小於後者,則不置換位置,一次比較,當第...