含義:對一個序列 A 中的元素 A[1] ~ A[n] ,令 i 從 1 到 n 枚舉,進行 n 趟操做,每趟從待排序部分 [i, n] 中選擇最小的元素,令其與待排序部分的第一個元素 A[i] 進行交換,這樣元素 A[i]就會與當前有序區間 [1, i -1]造成新的有序區間 [1, i]。
示意圖:
代碼:(複雜度:O(n^2) )c++
#include <cstdio> void select_sort(int a[], int n) { for (int i = 0; i < n; i ++) { int k = i; for (int j = i; j < n; j ++) { if (a[j] < a[k]) k = j; } int temp = a[k]; a[k] = a[i]; a[i] = temp; } } int main() { int a[5] = {5, 4, 3, 2, 1}; int len = sizeof(a) / sizeof(int); select_sort(a, len); for (int i = 0; i < len; i ++) printf("%d ", a[i]); return 0; }
含義: 對序列 A 的 n 個元素A [1] ~ A[n],令 i 從 2 到 n 枚舉,進行 n - 1 趟操做。假設某一趟是,序列 A 的前 n 個元素 A[1] ~ A[i - 1]已經有序,而範圍 [i, n]還未有序,那麼該趟從範圍 [1, i - 1] 中尋找某個位置 j ,使得將 A[i] 插入位置 j 後(A[j] 以後的元素都會後移一位),範圍 [1, i] 有序。
示意圖:
代碼:算法
#include <cstdio> void insert_sort(int a[], int n) { for (int i = 1; i < n; i ++) { int temp = a[i], j = i; // temp 臨時存放a[i], j 從 i 開始向前枚舉 while(j > 0 && temp < a[j - 1]) { a[j] = a[j - 1]; j --; } a[j] = temp; } } int main() { int a[5] = {5, 4, 3, 2, 1}; int len = sizeof(a) / sizeof(int); insert_sort(a, len); for (int i = 0; i < len; i ++ ) printf("%d ", a[i]); return 0; }
含義:在一個序列中,從首元素開始,進行兩兩互換使最大的元素放在序列的最後。這樣 n 個元素的序列須要進行 n - 1 趟交換。第一趟交換的次數是 n - 1 次,第二趟交換的次數是 n - 2 次...則第 i 趟交換的次數是 n - i 次。
代碼:spa
#include <cstdio> void bubble_sort(int a[], int n) { for (int i = 0; i < n - 1; i ++) for (int j = 0; j < n - i - 1; j ++) if (a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } int main() { int a[5] = {5, 4, 3, 2, 1}; int len = sizeof(a) / sizeof(int); bubble_sort(a, len); for (int i = 0; i < len; i ++) printf("%d ", a[i]); return 0; }
參考資料《算法筆記》胡凡.