資料結構排序 堆排序

2022-07-22 23:33:21 字數 1028 閱讀 3340

堆排序就是利用了最大堆(或最小堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字變得簡單。以最大堆為例,它的基本思想就是:

先將初始檔案r[1..n]建成乙個最大堆,此堆為初始的無序區;

再將關鍵字最大的記錄r[1](即堆頂)和無序區的最後乙個記錄r[n]交換,由此得到新的無序區r[1..n-1]和有序區r[n],且滿足r[1..n-1].keys≤r[n].key;

由於交換後新的根r[1]可能違反堆性質,故應將當前無序區r[1..n-1]調整為堆。然後再次將r[1..n-1]中關鍵字最大的記錄r[1]和該區間的最後乙個記錄r[n-1]交換,由此得到新的無序區r[1..n-2]和有序區r[n-1..n],且仍滿足關係r[1..n-2].keys≤r[n1..n].keys,同樣要將r[1..n-2]調整為堆; 重複此操作直到全部有序。

下面是示例圖:

1 #include 2 #include 3

4intn;5

6/*7* 生成堆8*/

9void heapadjust(int *array, int s, int

m)10

19if (!(array[0]

2023 array[s] =array[i];

24 s =i;25}

26 array[s] = array[0

];27}28

29/*

30* 堆排序

31*/

32void heapsort(int *array)

3339

for (i = n; i > 1; i--)

4046}47

48int

main()

4960

heapsort(array);

61 printf("

排序後為:");

62for (i = 1; i <= n; i++)

6366 printf("\n"

);67 }

資料結構 排序(堆排序)

最小堆的特性說明 即任何一非葉節點的值不大於其左右孩子節點的值。堆排序最適合取topn的資料 include myheap.h int myswap int src,int desc 調整樹 arr 需要排序的陣列 root 根節點 size 樹的大小 int changetree int arr,...

資料結構 排序 堆排序

附加空間 乙個儲存最大記錄的空間 是否是穩定的排序方法 不穩定 include stdio.h define maxsize 10 typedef int keytype typedef struct recordtype typedef struct table void swap table t...

資料結構 排序 堆排序

堆排序是選擇排序中的一種,選擇排序的思想是在未排序的數列中選擇乙個最大或者最小的資料加入已排序序列,大根堆這個結構的根節點就是最大值,因此會大大方便選擇。在完全二叉樹中,根 左,右 手動建堆 第一步 順序建立一棵樹 第二步 檢查非葉子結點是否滿足 根 左,右,不滿足就將當前節點與最大的乙個孩子互換 ...