選擇排序法

2021-10-02 19:23:11 字數 2872 閱讀 1708

演算法原理

直接 選擇 排序 的 基本 思想: n 個 記錄 的 直接 選擇 排序 可 經過 n- 1 趟 直接 選擇 排序 得到 有序 結果。

(1) 初始 狀態: 無序 區 為 a[ 1... n], 有序 區 為 空。

(2) 第 1 趟 排序: 在 無序 區 a[ 1... n] 中選 出 最小 的 記錄 a[ k], 將它 與 無序 區 的 第 1 個 記錄 a[ 1] 交換, 使 a[ 1… 1] 和 a[ 2... n] 分別 變為 記錄 個數 增加 1 的 新 有序 區 和 記錄 個數 減少 1 的 新 無序 區。

(3) 第 i 趟 排序: 第 i 趟 排序 開始時, 當前 有序 區 和 無序 區分 別為 a[ 1… i- 1] 和 a[ i.. n]( 1 ≤ i ≤ n- 1)。 該 趟 排序 從 當前 無序 區 中 選出 關鍵字 最小 的 記錄 a[ k], 將它 與 無序 區 的 第 1 個 記錄 a[ i] 交換, 使 a[ 1… i] 和 a[ i+ 1... n] 分別 變為 記錄 個數 增加 1 的 新 有序 區 和 記錄 個數 減少 1 的 新 無序 區。

這樣, n 個 記錄 的 檔案 的 直接 選擇 排序 可 經過 n- 1 趟 直接 選擇 排序 得到 有序 結果。 直接 選擇 排序 是 不穩 定的。

演算法草稿,三角列表示本輪排序後的結果

演算法實現

#include #include #define success		0

#define param_err -1

int getminpos(int * array, int low, int high)

int i = 0;

int minpos = low;

int min = array[low];

/*千萬注意這裡是 <= high, 因為陣列的最後乙個是high (n-1)*/

for(i = low; i <= high; i++)

} return minpos;

}int selectsort(int * array, int size)

int i = 0, j = 0;

int minpos = 0; /*當前無序區最小值的位置*/

int temp = 0;

#ifdef debug

int k = 0;

#endif

for(i = 0; i < size; i++)

#ifdef debug

printf("i = %d min = %d\n", i, temp);

printf("[");

/*有序區域*/

for(k =0; k < i+1; k++)

printf("] ");

/*無序區域*/

printf("[");

for(k = i+1; k < size; k++)

printf("]\n");

printf("\n");

#endif

} return success; }

int main(int argc, char ** ar**);

int i = 0;

printf("before sort: \n");

for(i = 0; i < 10; i++)

printf("\n");

selectsort(array, 10);

printf("after sort: \n");

for(i = 0; i < 10; i++)

printf("\n");

return 0;

}

除錯編譯

gcc selectsort.c -ddebug

除錯輸出

before sort:

7 3 5 8 0 9 1 2 4 6

i = 0 min = 0

[ 0 ] [ 3 5 8 7 9 1 2 4 6 ]

i = 1 min = 1

[ 0 1 ] [ 5 8 7 9 3 2 4 6 ]

i = 2 min = 2

[ 0 1 2 ] [ 8 7 9 3 5 4 6 ]

i = 3 min = 3

[ 0 1 2 3 ] [ 7 9 8 5 4 6 ]

i = 4 min = 4

[ 0 1 2 3 4 ] [ 9 8 5 7 6 ]

i = 5 min = 5

[ 0 1 2 3 4 5 ] [ 8 9 7 6 ]

i = 6 min = 6

[ 0 1 2 3 4 5 6 ] [ 9 7 8 ]

i = 7 min = 7

[ 0 1 2 3 4 5 6 7 ] [ 9 8 ]

i = 8 min = 8

[ 0 1 2 3 4 5 6 7 8 ] [ 9 ]

i = 9 min = 8

[ 0 1 2 3 4 5 6 7 8 9 ]

after sort:

0 1 2 3 4 5 6 7 8 9

排序法之選擇排序法

首先通過陣列中元素的比較方式來分析 用陣列中第乙個角標的元素與陣列中第二個角標的元素進行比較,發現9比6大,進行位置置換,此處應該定義乙個三方變數,用來記錄住置換過程的元素值,然後再用第乙個角標的元素與下乙個角標元素進行比較,按照全面的原則進行置換位置,如果前者小於後者,則不置換位置,一次比較,當第...

氣泡排序法 選擇排序法

相鄰兩個數進行比較 如果前者比後者大 就把前者和後者互換 比如十個數 經過九次比較 就可以得到乙個最大的數字於排列的最末端 再經過八次比較 可以得到乙個第二大的數 依次類推 即最大的數一次一次冒泡上來。include int main printf n 資料排序 for i 0 i 9 i 列印資料...

選擇排序法

1.直接選擇排序法 基本思想 每一趟 第i趟,i 0,1,2,n 1 在後面n i個待排序記錄中選出關鍵字最小的記錄,作為有序記錄序列的第i個記錄。直到第n 2趟完,待排記錄只剩下乙個,不完再選了!直接選擇排序法 void selectionsort int parry,int ilen if k ...