當前位置:
首頁 >
算法二之树形选择排序
發布時間:2023/12/3
28
豆豆
生活随笔
收集整理的這篇文章主要介紹了
算法二之树形选择排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、樹形選擇排序的基本思想
(1) 樹形選擇排序又稱錦標賽排序(Tournament Sort),是一種按照錦標賽的思想進行選擇排序的方法。首先對n個記錄的關鍵字進行兩兩比較,然后在n/2個較小者之間再進行兩兩比較,如此重復,直至選出最小的記錄為止。
?
(2) 樹形選擇排序(Tree Selection Sort),這個過程可用一棵有n個葉子結點的完全二叉樹表示。? ? ?例如,圖表中的二叉樹表示從8個數中選出最小數的過程。
8個葉子結點到根接點中的關鍵字,每個非終端結點中的數均等于其左右孩子結點中較小的數值,則根結點中的數即為葉子結點的最小數。在輸出最小數之后,割據關系的可傳遞性,欲選出次小數,僅需將葉子結點中的最小數(13)改為“最大值”,然后從該葉子接點開始,和其左(或右)兄弟的數值進行比較,修改從葉子結點到根的路徑上各結點的數,則根結點的數值即為最小值。同理,可依次選出從小到大的所有數。
(3) 由于含有n個子結點的完全二叉樹的深度為log2n+1,則在樹形選擇排序中,除了最小數值之外,每選擇一個次小數僅需要進行log2n次比較,因此,它的時間復雜度為O(nlogn)。但是,這種排序方法尚有輔助存儲空間較多、和“最大值”進行多余比較等缺點。為了彌補,威洛姆斯(J. willioms)在1964年提出了另一種形式的選擇排序——堆排序。?
?二、算法實現
算法從葉子節點中選出最大值,逆向存儲在數據隊列中,形成升序排序。
public static void treeSelectionSort(int[] data) {//長度小于2,無需排序if(data.length<2){return;}int leafCount = 1; //滿二叉樹的葉子節點數,非完全二叉樹葉子節點數//計算出滿二叉樹的葉子節點數,節點數大于等于數據隊列的長度while (leafCount < data.length) {leafCount *= 2;}int[] tree = new int[leafCount * 2]; //樹,tree[0]不存儲數據//data里面的值賦值到樹葉子節點for (int i = 0; i < data.length; i++) {tree[tree.length - i - 1] = data[i];}//初始化還沒有賦值的樹葉子結點,賦值葉子節點最小值for (int i = data.length; i < leafCount; i++) {tree[tree.length - i - 1] = Integer.MIN_VALUE;}//初始化,構建整棵樹for (int i = tree.length - 1; i > 1; i -= 2) {tree[i / 2] = Math.max(tree[i], tree[i - 1]);}data[data.length-1] = tree[1]; //將樹根節點賦值于dataint maxIndex; //堆最大值所對應的葉子節點的下標//繼續尋找剩下的最大值,逆向存儲,升序排序for (int i = data.length-2; i >=0; i--) {maxIndex = tree.length - 1; //默認堆最后一個位置//尋找樹根值所在的葉子節點的位置while (tree[maxIndex] != tree[1]) {maxIndex--;}tree[maxIndex]=Integer.MIN_VALUE; //該葉子節點賦值最小值//調整樹,根節點值最大while(maxIndex>1){//左葉子結點if (maxIndex % 2 == 0) {tree[maxIndex / 2] = Math.max(tree[maxIndex] ,tree[maxIndex + 1]);} else {tree[maxIndex / 2] = Math.max(tree[maxIndex] ,tree[maxIndex - 1]);}maxIndex/=2;//指向父節點 }data[i] = tree[1]; //將樹根節點賦值于data }}?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的算法二之树形选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加州州长签署《维修权法案》,促进消费者自
- 下一篇: 消息称一加 12 手机提供白色玻璃版本,