演算法原理
直接 選擇 排序 的 基本 思想: 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 ...