含义:对一个序列 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; }
参考资料《算法笔记》胡凡.