樹形選擇排序又稱錦標賽排序(Tournament Sort),是一種按照錦標賽的思想進行選擇排序的方法。首先對n個記錄的關鍵字進行兩兩比較,然後在n/2個較小者之間再進行兩兩比較,如此重複,直至選出最小的記錄為止。
這個過程可用一棵有n個葉子結點的完全二叉樹表示。例如,圖表2中的二叉樹表示從8個數中選出最小數的過程。8個葉子結點到根接點中的關鍵字,每個非終端結點中的數均等於其左右孩子結點中較小的數值,則根結點中的數即為葉子結點的最小數。在輸出最小數之後,割據關係的可傳遞性,欲選出次小數,僅需將葉子結點中的最小數(13)改為“最大值”,然後從該葉子接點開始,和其左(或右)兄弟的數值進行比較,修改從葉子結點到根的路徑上各結點的數,則根結點的數值即為最小值。同理,可依次選出從小到大的所有數。由於含有n個子結點的完全二叉樹的深度為log2n+1,則在樹形選擇排序中,除了最小數值之外,每選擇一個次小數僅需要進行log2n次比較,因此,它的時間複雜度為O(nlogn)。但是,這種排序方法尚有輔助存儲空間較多、和“最大值”進行多餘比較等缺點。為了彌補,威洛姆斯(J. willioms)在1964年提出了另一種形式的選擇排序——堆排序。
#region "樹形選擇排序"
/// <summary>
/// 樹形選擇排序,Powered By 思念天靈
/// </summary>
/// <param name="mData">待排序的數組</param>
/// <returns>已排好序的數組</returns>
public int[] TreeSelectionSort(int[] mData)
{
int TreeLong = mData.Length * 4;
int MinValue = -10000;
int[] tree = new int[TreeLong]; // 樹的大小
int baseSize;
int i;
int n = mData.Length;
int max;
int maxIndex;
int treeSize;
baseSize = 1;
while (baseSize < n)
{
baseSize *= 2;
}
treeSize = baseSize * 2 - 1;
for (i = 0; i < n; i++)
{
tree[treeSize - i] = mData[i];
}
for (; i < baseSize; i++)
{
tree[treeSize - i] = MinValue;
}
// 構造一棵樹
for (i = treeSize; i > 1; i -= 2)
{
tree[i / 2] = (tree[i] > tree[i - 1] ? tree[i] : tree[i - 1]);
}
n -= 1;
while (n != -1)
{
max = tree[1];
mData[n--] = max;
maxIndex = treeSize;
while (tree[maxIndex] != max)
{
maxIndex--;
}
tree[maxIndex] = MinValue;
while (maxIndex > 1)
{
if (maxIndex % 2 == 0)
{
tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex + 1] ? tree[maxIndex] : tree[maxIndex + 1]);
}
else
{
tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex - 1] ? ‍tree[maxIndex] : tree[maxIndex - 1]);
}
maxIndex /= 2;
}
}
return mData;
}
#endregion
相關詞條
-
選擇排序
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始...
基本選擇排序 算法性能 樹形選擇排序 參考代碼 -
排序
排序是計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。分內部排序和外部排序,若整個排序過程不需要訪問外存便能完成,...
概念 冒泡排序 選擇排序 插入排序 希爾排序 -
外部排序
外部排序指的是大檔案的排序,即待排序的記錄存儲在外存儲器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部存儲器之間進行多次數據交換,以達到排序整個檔案的目的。
規則種類 外部排序 初始順串 合併排序 其他算法 -
排序關鍵字
一個數據元素可由多個數據項組成,以數據元素某個數據項作為比較和排序依據,則該數據項稱為排序關鍵字。
基本概念 算法 算法比較 -
TreeGrid
就是樹形表格) TreeGrid 選擇”按列2降序排序”,排序後的結果如下...按照某一屬性和規則排序,展示出有序的樹形結構。解決一次性構造無限級樹形...,一次性生成樹形表格,對樹形表格進行完整分頁,對表格列進行全排序;或者可以...
軟體介紹 軟體功能 研究原因 -
多叉樹
對每一個層次的節點按照某一屬性和規則排序,展示出有序的樹形結構。解決...層次的節點按照某一屬性(比如分支機構編號)進行排序,以展示出有序的樹形...與Oracle資料庫中的層次查詢類似,即兄弟節點橫向排序)3、實現對樹形表格...
相關介紹 示例 設計方案 原始碼實現 思考與總結 -
數據結構與算法(第2版)
/1055.3.1直接選擇排序/1055.3.2樹形選擇排序/1075.4交換...5.3Shell排序過程104圖5.4直接選擇排序106圖5.5第一次樹形選擇排序選出最小排序碼13107圖5.6第二次樹形選擇排序選出最小排序碼...
內容簡介 編輯推薦 目錄 -
數據結構(C語言版)
10.2.3 希爾排序 10.3 快速排序 10.4 選擇排序 10.4.1 簡單選擇排序 10.4.2 樹形選擇排序...的實現 11.4 置換一選擇排序 11.5 最佳歸併樹 第12章...
作者簡介 內容簡介 目錄 中國鐵道出版社出版圖書 -
數據結構教程與題解
排序7.3.1 冒泡排序7.3.2 快速排序7.4 選擇排序7.4.1直接選擇排序7.4.2 堆排序7.5 歸併排序7.6 分配排序7.7內部排序方法的比較和選擇7.8外部排序簡介7.8.1 磁碟排序7.8.2 磁帶...
內容簡介 圖書目錄 北大版數據結構教程與題解