YTU 2757 C 習題 堆排序

2021-09-21 17:46:54 字數 1054 閱讀 2196

1.堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。

堆是乙個近似完全二叉樹的結構,並同時滿足堆性質:即孩子節點的鍵值或索引總是小於(或者大於)它的父節點。(假定一組資料的第n(n>=0)個數是乙個父節點,那麼對應第2n+1和第2n+2個數便是它的孩子節點,孩子節點最多兩個)

2.堆排序的思想

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

其基本思想為(此為構建大頂堆方法,):

1)將初始待排序關鍵字序列(r1,r2....rn)構建成大頂堆,此堆為初始的無序區;(構建方法:從左到右選擇一組數中最後乙個有孩子節點的父節點數,讓它與孩子比較,與最大的孩子互換位置,如果父節點最大,就不用換。這個執行完以後,以此父節點原來的位置為準,向左取父節點執行一樣的操作,直到取的父節點到達沒有可交換的孩子節點的位置為止;依次取父節點執行操作直到左邊第一位,此時無序區(r[1,2,3......n])構建完畢)

2)將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序區(r1,r2,......rn-1)和新的有序區(rn),且滿足r[1,2...n-1]<=r[n];(此時的r[n]為已確定的最大值,將它單獨拿出來即可) 

3)由於交換後新的堆頂r[1]可能違反堆的性質,因此需要對當前無序區(r1,r2,......rn-1)調整為新堆,(調堆方法:從左邊第乙個數開始,將它和自己的孩子節點比較,與較大的孩子互換位置,如果它本身最大,就不用換。此數到達新位置,再和新的孩子節點比較互換,重複執行直到這個數沒有可以交換位置的孩子節點為止。再選取左邊第二個數,重複執行上述操作。執行到最後乙個有孩子節點的數為止,調堆完畢。)然後再次將r[1]與無序區最後乙個元素交換,得到新的無序區(r1,r2....rn-2)和新的有序區(rn-1,rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。

#include

using namespace std;

void  heapadjust(int a,int i,int m)//排列成「堆」的形式

}int main()

else

break;

YTU 2754 C 習題 快速排序

時間限制 1 sec 記憶體限制 128 mb 提交 92 解決 55 以某個數為標準,把比這個數大的都移到它的後面,比這個數小的都移到它的前面,這樣它後面的任意乙個數都比它前面的任意乙個數大,再將這前後兩組數再分別重複這一過程,最後就會得到有序的數列 補充 如果從大到小排列可以將比這個數大的都移到...

YTU 2758 C 習題 基數排序

基數排序是一種分配排序,其基本思想是 排序過程無須比較關鍵字,而是通過 分配 和 收集 過程來實現排序。它們的時間複雜度可達到線性o n 基數排序所做的事情,是對n位分別進行排序。從直覺上來看,人們可能會覺得應該首先按最高有效位進行排序,不過這點與我們的直覺相反,基數排序首先對最低有效位數字進行排序...

演算法導論 堆排序習題

1.怎樣利用最大 小 堆構成的優先實現先進先出佇列或者棧 開始看這道題沒有弄清以什麼優先,原來是先進先出佇列只要保證先進來優先順序高,棧保證後進來優先順序高,然後每次彈出堆頂元素即可 2.如何在logn時間裡刪除乙個元素 思路和如何在堆中增加乙個元素是一樣的,因為堆要的形狀要保證是一顆完全二叉樹,決...