日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

算法二之树形选择排序

發布時間: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 }}

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的算法二之树形选择排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。