演算法導論 堆排序習題

2021-06-16 13:42:55 字數 1275 閱讀 2113

1.怎樣利用最大(小)堆構成的優先實現先進先出佇列或者棧

開始看這道題沒有弄清以什麼優先,原來是先進先出佇列只要保證先進來優先順序高,棧保證後進來優先順序高,然後每次彈出堆頂元素即可

2.如何在logn時間裡刪除乙個元素

思路和如何在堆中增加乙個元素是一樣的,因為堆要的形狀要保證是一顆完全二叉樹,決定了增減操作只能在堆的尾部進行。

1.先把該元素和堆尾元素交換,並將堆大小減一

2.對該位置調整堆

3.在nlogk時間裡完成對k個有序鍊錶的有序合併,n為所有元素的個數

1.首先將每個佇列的隊首元素提取出來,組建為乙個最小堆,這裡要注意,我們應該記錄每個元素來自於哪乙個佇列

堆中元素應為這樣

耗時o(klogk),看到有人說o(k)....應該是筆誤

2.提取堆頂元素o(1)

3.從剛才出堆的元素來自的佇列中新增乙個元素到堆尾,調整堆耗時o(logk)

總耗時= o(klogk)+o(nlogk)=o(nlogk)

4.young氏矩陣,該矩陣行列均是有序的

問題1:用o(m+n)時間完成以下操作,m,n分別為該矩陣的行和列數

問題2:證明利用該矩陣能在o(n^3)時間內完成對n^2個元素進行排序

考慮到書上的乙個性質,當y[m][n]《無窮大時是個滿矩陣,好吧,我就不糾結到底這個排序是是公升序還是降序了,應該是公升序......

1.1有了公升序的性質,那麼很容易知道矩陣的右上角的元素肯定是最小的

那麼每次將其提出,肯定要在剩下的元素中選乙個最小的作為新矩陣的最小元素,這個元素為min產生,將兩者較小的移到該地方

不難證明經過該操作後矩陣的性質還是滿足的。這樣每次要麼向右移動乙個單位,要麼向下移動乙個單位

然後轉而將問題變為y[m-1][n]或者y[m][n-1]...直到最後只剩下乙個元素,最後的時間複雜度為o(m+n)

1.2 同理向矩陣中欣新增元素的時候先把它新增到矩陣尾部,然後比較左邊和上面的元素,取較大者交換之

這樣就可以把問題由[m,n]規模變為[m-1,n]或[m,n-1]

1.3 想到這個要稍微轉換一下思維,和右上角的元素比較,大,則把這行刪掉,小,則把這一列刪掉

ps:為什麼比較排序的下界是o(nlogn)?

因為堆任意乙個序列,排序有n!可能,解2^h>n!得到h>nlogn ,樹的高度即需要比較的次數

演算法導論 堆排序

堆排序演算法 heapsort max heapify過程,其執行時間為 lg n 是保持最大堆性質的關鍵 build max heap過程,以線性時間執行,可以在無序的輸入陣列基礎上構造出最大堆 heapsort過程,執行時間 n lg n 對乙個陣列原地進行排序 heapsort過程 1 建最大...

演算法導論 堆排序實現

我建立了乙個heap的資料結構,而不是像stl那樣使用函式解決堆排序,當然stl的比較優雅一點,我只是提供第二個思路 ifndef heap sort h define heap sort h include include include ifdef debug include endif deb...

學習演算法導論 堆排序

演算法導論 第三版書中陣列下標是從1開始的,但是這裡從0開始。堆分為兩種,即最大堆和最小堆,最大堆的定義為 當陣列a大小為n時 a中有n個元素 若2 i 1 a 2 i 1 若2 i 2 a 2 i 2 則這樣的資料結構稱為最大堆。說白了就是根節點 包括子樹的根節點 的值不小於左節點和右節點的值 如...