選擇排序演算法分析及程式示例

2021-08-30 05:51:41 字數 1395 閱讀 6059

[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 記錄交換。這是一般書上的定義。實際上選擇排序,就是每一輪選者乙個最值出來,然後在剩下的資料中又選擇乙個最值出來,直到資料被選擇完畢。這就是所謂的簡單選擇排...