簡介
樹形排序也被稱為錦標賽排序
步驟
1、把n個物件的排序碼進行兩兩比較,得到n/2個排序的優勝者,作為第一步比較的結果留下來
2、然後對這n/2個物件再進行排序碼的兩兩比較,…,如此重複,直到選出乙個排序碼最小的物件為止。
3、構建一顆包含n個結點的完全二叉樹,當二叉樹不滿(葉子結點個數為奇數),用關鍵字為∞的結點填滿,選出的最小關鍵字就是這棵樹的根節點。在輸出了最小關鍵字之後,為了選擇次小關鍵字,把最小關鍵字的葉子節點置為∞。
4、繼續將葉子結點和其兄弟節點的關鍵字比較,修改從該葉子節點到根節點上各結點的值,則根節點的值被修改為次小的關鍵字,直到左右的結點輸出為止。
**
void treeselectsort(int *a,int len)
if(len%2==1)
int treesize = 2 * len - 1; //完全二叉樹的節點數
int low = 1;
int tree[treesize+1];//臨時的樹儲存空間
//由後向前填充此樹,索引從1開始 ,這樣在之後給父節點賦值的時候,就不需要分左右節點了
for(int i = len,j=0 ;i >= 1; --i,j++)
for(int i = treesize+1;i>1;i-=2)
}
}
}
樹形選擇排序演算法
樹形選擇排序有時也稱為錦標賽排序。排序過程中,按照錦標賽比賽規則進行,將所有n個資料看成一棵完全二叉樹的葉子結點,首先,完全二叉樹的葉子結點兩兩比較,勝出的兄弟進入樹的上一層繼續和兄弟進行比較,如果某個葉子結點沒有兄弟,則直接進入上一層,一直到二叉樹的第二層的兩個兄弟節點進行比較,勝出者為第一名。為...
排序演算法之選擇排序 選擇排序 堆排序
直接選擇排序 如下 下面 是一次迴圈同時挑選出最大和最小數,並將其與左右交換 選擇排序 void selectionsort int a,int len swap a min a left 如果最大數的下標在為left,證明要交換的最大數已經被 換到min小標所表示的位置,只需要將right和min...
(三)排序演算法之選擇排序
選擇排序和之前說的氣泡排序和插入排序套路差不多,都是將陣列分隔為已排序和未排序子陣列,主要區別在於元素選取和放入。選擇排序是從未排序陣列中選最小 或最大 的乙個放入已排序的陣列後。下面用 分隔已排序和未排序陣列,如 待排序資料 7,0,2,8,1 一開始有序陣列是空的 一次排序 0 7,2,8,1 ...