排序演算法 堆排序 C

2021-06-05 14:14:29 字數 889 閱讀 5399

堆排序的基本過程:

1. 找到最大的元素,放到最後面去

2. 找到第二大的元素,放在倒數第二個位置

。。。依次類推,直到所有元素完成排序。

其中每一步中,找最大元素的方法是借助堆。堆可以看成是乙個完全二叉樹,且每個節點的值都大於它的子節點的值。對於陣列來說,就是任意第[i]個元素大於第[2i+1]和第[2i+2]個元素。為了將無序陣列變成堆,需要從葉到根依次建堆。也就是從 從後往前第乙個有子節點的節點 開始,到根節點為止,依次建堆。之所以選擇這個順序,是因為這樣可以保證對每乙個節點建堆的時候它的左右子樹已經是堆了。完成第一次建堆後,首個元素為最大值,將其與最後乙個元素互換完成整個排序的第一步。

此時陣列中最後乙個元素是最大值,前n-1個元素中,根節點的左右子樹都是堆,只有根元素不滿足堆的條件。只需對根節點在執行一次調整最大堆的過程,前n-1個元素將又建成乙個堆,第二大的元素位於根。與倒數第二個元素交換,完成整個過程的第二步。

依次類推,完成整個排序過程。

// adjust heap for array that begin at array, and length = nlen.

// the left subtree and right subtree are already heap.

void maxheapify(int array, size_t nlen)

array[idxlarge] = ntemp;

}void heapsort(int array, size_t nlength)

// swap root of heap with the last element, and re-adjust heap.

for (int i=nlength-1; i>=1; i--)

}

排序演算法 堆排序(c

堆排序思想 首先將待排序的記錄序列構造成乙個堆,然後將堆頂元素移走,此時,選出了堆中所有記錄的最大者即堆頂。並將剩餘的記錄再調整為堆,這樣又找出了次大的元素,以此類推,直到堆中只有乙個記錄為止。a.將無序序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆 b.將堆頂元素與末尾元素交換,將最大元素...

排序演算法 堆排序(C )

堆排序分為大根堆和小根堆。堆排思想 採用樹的概念來組織資料結構,在這裡我是根據小根堆對資料進行排序 首先我們insertheap一組資料,在插入的過程中採用向上調整 shiftup 每次將插入的最小值放在堆頂 heap 0 然後我們removeheap建立好的堆,將heap 0 節點剔除作為返回值,...

C 堆排序演算法

基本思路 1.把乙個陣列按下錶構造成乙個完全二叉樹 2.找到陣列的最後乙個元素 最後乙個葉子結點 判斷它在左子樹上還是右子樹上 3.如果在左子樹上,直接拿該結點與它的父結點比較,如果比父結點大,與父結點交換位置 4.如果在右子樹上,左右子樹先比較大小,把大的放在右子樹上,再將右子樹與父結點比較,把大...