C語言實現堆排序

2021-06-27 07:04:11 字數 1324 閱讀 5048

一、堆排序的原理。

堆排序是利用堆的性質進行的一種選擇排序。

堆實際上是一顆完全二叉樹,其中任何一非葉節點滿足性質:

key[i] <= key[2i+1] && key[i] <= key[2i] 或 key[i] >= key[2i+1] && key[i] >= key[2i]。 任何一非葉節點的關鍵字不大於或者不小於其左右孩子。

二、堆排序的思想。

利用大項堆(小項堆)堆頂記錄的是最大關鍵字(最小關鍵字)這一特性,使得每次從無序中選擇最大記錄(最小記錄)變得容易。

下面最要考慮的是大項堆的思想:

1)將初始待排序關鍵字序列(r1,r2......rn)構建成大項堆,此堆為初始的無序區。

2)將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序(r1,r2....rn-1)和新的有序r[n],並且滿足r[1,2...n-1] < =r[n];

3)由於交換後新的堆項r[1]可能違反堆的性質,因此需要對當前無序區(r[1,2...n-1])調整為新的堆,然後再次將r[1]與無序區最後乙個元素交換,得到新的無序區(r1,r2...rn-2),重複該過程。

操作過程如下:

1)初始化堆,將r[1..n]構造為堆.

2)將當前無序區的堆頂元素r[1]同該區間的最後乙個記錄交換,然後將新的無序區調整為新的堆。

因此對於堆排序,最重要的兩個操作就是構造初始堆和調整堆,其實構造初始堆事實上也是調整堆的過程,只不過構造初始堆是對所有的非葉節點都進行調整。

c程式#include

#include

void heap(int *a, int length);

void adjust(int *a, int index, int length);

int a[8] = ;

int main()

puts("\n");

heap(a, 7);

printf("heapsort data--->:");

for(i = 1; i < 8; ++i)

puts("\n");

}void heap(int *a, int length)

//對剩下資料建立新的堆

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

puts("\n");}}

//建立堆函式

void adjust(int *a, int i, int length)

//如果a[i] >a[j],這滿足堆的性質,就退出該函式,不要進行後續操作

if(a[i] > a[j])

else

//printf("--------[%d]-----\n", j);}}

C語言實現堆排序

堆排序在初學時對我來說也是比較難掌握的一種排序方法,大頂堆 小頂堆的定義能搞明白就不錯了,演算法在初學的時候基本是自己寫不出來的。現在回過頭來看一看演算法描述,發現其實也不難理解,甚至還能看出來書中演算法描述的小瑕疵,不過還是要記錄一下,難免會忘記。將初始待排序關鍵字序列 r1,r2 rn 構建成大...

堆排序 c語言實現

演算法特點 1.不穩定排序 2.只能用於順序結構,不能用於鏈式結構 3.初始建堆所需比較次數較多,因此記錄數較少不宜採用。堆排序在最壞情況下時間複雜度為o nlogn 相對於快速排序的o n n 而言是乙個優點,當記錄比較多時較為高效。include include using namespace ...

c語言 實現堆排序演算法

今天在 演算法導論 第二版看完了 堆排序 演算法,就順便用c語言實現了一下。堆排序演算法的核心思想,使用一種二叉堆的資料結構來儲存資料,其中二叉堆 最小二叉堆 的主要性質為 1 父節點小於所有的子節點的數值 注 最小堆 2 二叉堆為滿二叉樹 其中堆排序演算法,主要包括一下幾個主要的部分 1 保持堆特...