排序演算法 heap排序 改良的交換排序演算法

2021-06-09 00:42:42 字數 1535 閱讀 7923

說明

選擇排序法的概念簡單,每次從未排序部份選一最小值,插入已排序部份的後端,其時間主要花費於在整個未排序部份尋找最小值,如果能讓搜尋最小值的方式加快,選擇排序法的速率也就可以加快,heap排序法讓搜尋的路徑由樹根至最後乙個樹葉,而不是整個未排序部份,因而稱之為改良的選擇排序法。

解法heap排序法使用heap tree(堆積樹),樹是一種資料結構,而堆積樹是乙個二元樹,也就是每乙個父節點最多只有兩個子節點(關於樹的詳細定義還請見資料結構書籍),堆積樹的父節點若小於子節點,則稱之為最小堆積(min heap),父節點若大於子節點,則稱之為最大堆積(maxheap),而同一層的子節點則無需理會其大小關係,例如下面就是乙個堆積樹:

可以使用一維陣列來儲存堆積樹的所有元素與其順序,為了計算方便,使用的起始索引是1而不是0,索引1是樹根位置,如果左子節點儲存在陣列中的索引為s,則其父節點的索引為s/2,而右子節點為s+1,就如上圖所示,將上圖的堆積樹轉換為一維陣列之後如下所示:

首先必須知道如何建立堆積樹,加至堆積樹的元素會先放置在最後乙個樹葉節點位置,然後檢查父節點是否小於子節點(最小堆積),將小的元素不斷與父節點交換,直到滿足堆積樹的條件為止,例如在上圖的堆積加入乙個元素12,則堆積樹的調整方式如下所示:

建立好堆積樹之後,樹根一定是所有元素的最小值,您的目的就是:

將最小值取出

然後調整樹為堆積樹

不斷重複以上的步驟,就可以達到排序的效果,最小值的取出方式是將樹根與最後乙個樹葉節點交換,然後切下樹葉節點,重新調整樹為堆積樹,如下所示:

調整完畢後,樹根節點又是最小值了,於是我們可以重複這個步驟,再取出最小值,並調整樹為堆積樹,如下所示:

如此重複步驟之後,由於使用一維陣列來儲存堆積樹,每一次將樹葉與樹根交換的動作就是將最小值放至後端的陣列,所以最後陣列就是變為已排序的狀態。其實堆積在調整的過程中,就是乙個選擇的行為,每次將最小值選至樹根,而選擇的路徑並不是所有的元素,而是由樹根至樹葉的路徑,因而可以加快選擇的過程, 所以heap排序法才會被稱之為改良的選擇排序法。

**清單:

void createheap(int number)

; for(i=1;i<=max;++i) }

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

number[i] = heap[i];

}void heapsort(int number)

}

改良 氣泡排序演算法

最近講第二個大課題 陣列。講到陣列,肯定不可避免的就要講到兩個排序演算法了,冒泡演算法首當其衝。整理了一下氣泡排序的內容,我跟學生說 要你們掌握兩個東西,乙個是演算法思想,乙個是核心 演算法思想如下 1.將相鄰兩個數比較,將小 大 的調到前頭。最後排序結果,從小到大 從大到小 每輪比較後,最大 小 ...

堆 heap 排序演算法

堆排序演算法是複雜的排序演算法,是不穩定的排序演算法。1 堆排序的基本思想 堆排序定義 n個有序列a1,a2,an成為堆,有下面兩種不同型別的堆。大根堆 所有子節點都大於其父節點,即ai a2i且ai a2i 1。小根堆 所有子節點都小於其父節點,即ai a2i且ai a2i 1。若將此序列所儲存的...

排序演算法 交換類排序

今天我們討論一下交換類排序。交換排序的演算法思想 通過交換逆序的元素實現交換排序。交換排序主要有兩種 一種是氣泡排序,一種是快速排序。演算法思想 氣泡排序是一種簡單的交換類排序演算法,它是通過交換相鄰兩個資料元素,逐步將排序序列變成有序序列。基本演算法思想描述如下 假設待排序元素有n個,從第乙個元素...