1.选择排序
含义:对一个序列 A 中的元素 A[1] ~ A[n] ,令 i 从 1 到 n 枚举,进行 n 趟操作,每趟从待排序部分 [i, n] 中选择最小的元素,令其与待排序部分的第一个元素 A[i] 进行交换,这样元素 A[i]就会与当前有序区间 [1, i -1]形成新的有序区间 [1, i]。
示意图:
代码:(复杂度:O(n^2) )
#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;
}
2.插入排序
含义: 对序列 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;
}
3.冒泡排序
含义:在一个序列中,从首元素开始,进行两两互换使最大的元素放在序列的最后。这样 n 个元素的序列需要进行 n - 1 趟交换。第一趟交换的次数是 n - 1 次,第二趟交换的次数是 n - 2 次...则第 i 趟交换的次数是 n - i 次。
代码:
#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;
}
参考资料《算法笔记》胡凡.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。