1、直接選擇排序的基本思想
n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
①初始狀態:無序區為r[1..n],有序區為空。
②第1趟排序
在無序區r[1..n]中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[1]交換,使r[1..1]和r[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
……③第i趟排序
第i趟排序開始時,當前有序區和無序區分別為r[1..i-1]和r[i..n](1≤i≤n-1)。該趟排序從當前無序區中選出關鍵字最小的記錄r[k],將它與無序區的第1個記錄r[i]交換,使r[1..i]和r[i+1..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
這樣,n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。
動畫演示**自:
3、演算法描述
直接選擇排序的具體演算法如下:
void selectsort(seqlist r)
//endif
} //endfor
} //seleetsort
4、演算法分析
(1)關鍵字比較次數
無**件初始狀態如何,在第i趟排序中選出最小關鍵字的記錄,需做n-i次比較,因此,總的比較次數為:
n(n-1)/2=0(n2)
(2)記錄的移動次數
當初始檔案為正序時,移動次數為0
檔案初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值3(n-1)。
直接選擇排序的平均時間複雜度為o(n2)。
(3)直接選擇排序是乙個就地排序
(4)穩定性分析
直接選擇排序是不穩定的
【例】反例[2,
2,1]
源**:
#include /*
直接排序
*/static void straight_sel_sort(int arr, int length);
int main(void)
; straight_sel_sort(arr, 7);
for (i = 0; i < 7; i++)
putchar('\n');
return 0;
}static void straight_sel_sort(int arr, int length)
} if (k != i) //交換arr[i]和arr[k]的值
}}
演算法 排序 選擇排序(直接選擇和堆排序)
這裡介紹兩種選擇排序演算法 直接選擇排序和堆排序 選擇排序基本思想 每一趟從待排序的序列中選出關鍵字最小 最大 的元素,順序放在已排好序的子串行的最後,直到全部元素排序完畢。1 直接選擇排序 基本原理 每一次從待排序序列中選取最小的元素順序放在以排好的序列後面,例如序列r,先從r中選擇最小的元素,將...
排序演算法(直接選擇排序)
為什麼我們要叫直接選擇排序呢?在最開始的時候,待排序區間是整個陣列,從區間選乙個最小的與區間第乙個交換位置,然後將待排序區間從第二個開始,繼續以上操作,直至待排序區間長度為0 我們還是以為例 初始 3 5 7 9 8 6 2 1 4 0 第一趟 05 7 9 8 6 2 1 4 3 第二趟 0 17...
排序演算法 直接選擇排序
選擇排序的基本思想是 每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放入已排序數列的最後,直到全部記錄排序完畢。直接選擇排序是一種簡單直觀的排序演算法。它的工作原理 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列...