[b]例項說明[/b]
用直接選擇排序方法對陣列進行排序。
[b]例項解析[/b]
選擇排序( selection sort )的基本思想是:每趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子檔案的最後,直到全部記錄排序完畢。
常用的選擇排序方法有直接選擇排序和堆排序。
[b]直接選擇排序( straight selection sort )[/b]
直接選擇排序的基本思想是 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 趟直接選擇排序得到有序結果。
直接選擇排序的具體演算法如下:
void selectsort(seqlist r)
puts("please input the elements one by one:");
for(i=1;i<=n;i++)
scanf("%d",&r[i]);
puts("the sequence you input is:");
for(i=1;i<=n;i++)
printf("%4d",r[i]);
select_sort(n);
puts("\nthe sequence after select_sort is:");
for(i=1;i<=n;i++)
printf("%4d",r[i]);
puts("\n press any key to quit…");
getch();
} 歸納注釋
關鍵字比較次數:無**件初始狀態如何,在第 i 趟排序中選出最小關鍵字的記錄,需做 n-i 次比較,因此,總的比較次數為 n(n-1)/2=o(n^2 )。
記錄的移動次數:當初始檔案為正序時,移動次數為 0。檔案初態為反序時,每趟排序均要執行交換操作,總的移動次數取最大值 3(n-1)。直接選擇排序的平均時間複雜度為 o(n^2 )。
直接選擇排序是乙個就地排序。
穩定性分析:直接選擇排序是不穩定的,反例比如 [2,2,1]。
氣泡排序演算法分析及程式示例
b 例項說明 b 用氣泡排序方法對陣列進行排序。b 例項解析 b 交換排序的基本思想是兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。應用交換排序基本思想的主要排序方法有氣泡排序和快速排序。b 氣泡排序 b 將被排序的記錄陣列 r 1.n 垂直排列,每個記錄 ...
快速排序演算法 vb示例及分析
快速排序對氣泡排序的一種改進。它的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。快速排序演算法,對字串陣列進行排序 private s...
排序演算法 簡單選擇排序演算法實現及分析
簡單選擇排序 selection sort 就是通過n 1次關鍵字排序之間的比較,從n i 1個記錄中選擇關鍵字最小的記錄,並和第i 1 i n 記錄交換。這是一般書上的定義。實際上選擇排序,就是每一輪選者乙個最值出來,然後在剩下的資料中又選擇乙個最值出來,直到資料被選擇完畢。這就是所謂的簡單選擇排...