簡單選擇排序(****** selection sort ,又稱為直接選擇排序)的基本操作是:通過n-i次關鍵字間的比較,從n-i+1個記錄中選取關鍵字最小的記錄,然後和第i個記錄進行交換,i=1, 2, … n-1 。
1 排序示例
例:設有關鍵字序列為:7, 4, -2, 19, 13, 6,直接選擇排序的過程如下圖10-8所示。
2 演算法實現
void ******_selection_sort(sqlist *l)
int m, n , k;
for (m=1; mlength; m++)
k=m ;
for (n=m+1; n<=l->length; n++)
if ( lt(l->r[n].key, l->r[k].key) ) k=n ;
if (k!=m) /* 記錄交換 */
l->r[0]=l->r[m];
l->r[m]=l->r[k];
l->r[k]=l->r[0];
時間複雜度是:t(n)=o(n2)
空間複雜度是:s(n)=o(1)
從排序的穩定性來看,直接選擇排序是不穩定的。
樹形選擇排序
首先對n個記錄的關鍵字兩兩進行比較,選取én/2ù個較小者;然後這én/2ù個較小者兩兩進行比較,選取én/4ù個較小者… 如此重複,直到只剩1個關鍵字為止。
該過程可用一棵有n個葉子結點的完全二叉樹表示,如圖10-9所示。
每個枝結點的關鍵字都等於其左、右孩子結點中較小的關鍵字,根結點的關鍵字就是最小的關鍵字。
輸出最小關鍵字後,根據關係的可傳遞性,欲選取次小關鍵字,只需將葉子結點中的最小關鍵字改為「最大值」 ,然後重複上述步驟即可。
含有n個葉子結點的完全二叉樹的深度為é㏒2nù+1,則總的時間複雜度為o(n㏒2n) 。
簡單選擇排序 簡單選擇排序詳解
n個記錄的檔案的直接選擇排序可經過n 1趟直接選擇排序得到有序結果 初始狀態 無序區為r 1.n 有序區為空。第1趟排序 在無序區r 1.n 中選出關鍵字最小的記錄r k 將它與無序區的第1個記錄r 1 交換,使r 1.1 和r 2.n 分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區...
選擇排序 簡單選擇排序
在要排序的一組數中,選出最小 或者最大 的乙個數與第1個位置的數交換 然後在剩下的數當中再找最小 或者最大 的與第2個位置的數交換,依次類推,直到第n 1個元素 倒數第二個數 和第n個元素 最後乙個數 比較為止。第一趟,從n個記錄中找出關鍵碼最小的記錄與第乙個記錄交換 第二趟,從第二個記錄開始的n ...
選擇排序 簡單選擇排序
1.選擇排序 簡單選擇排序,堆排序 與交換排序 氣泡排序,快速排序 的區別 每次比較如果發現較小的元素在後面,就交換兩個相鄰的元素。而選擇排序演算法的改進在於 先並不急於調換位置,先從a 1 開始逐個檢查,看哪個數最小就記下該數所在的位置p,等一躺掃瞄完畢,再把a p 和a 1 對調,這時a 1 到...