一、排序
- 稳定性
- 内部排序、外部排序
- 排序的种类
插入排序
思想:每次将一个待排序的数插入到已排好序的序列中
void insert_sort(int a[], int n) {
for (int i = 1; i < n; i++) {
if (a[i] < a[i - 1]) {
int tmp = a[i];
int j;
for (j = i - 1; j >= 0 && a[j] > tmp; j--) {
a[j + 1] = a[j];
}
a[j] = tmp;
}
}
}
折半插入排序
void insert_sort(int a[], int n) {
for (int i = 1; i <= n; i++) {
a[0] = a[i];
int l = 1, r = i - 1;
while (l <= r) {
int mid = l + r >> 1;
if (a[mid] > a[0]) r = mid - 1; else l = mid + 1;
}
for (int j = i - 1; j >= r + 1; j--) {
a[j + 1] = a[j];
}
a[r + 1] = a[0];
}
}
希尔排序
先分割成形如
[
i
,
i
+
d
,
i
+
2
d
,
i
+
3
d
.
.
.
.
i
+
k
d
]
[i,i+d,i+2d,i+3d....i+kd]
[i,i+d,i+2d,i+3d....i+kd]若干个子序列,分别进行插入排序,缩小增量
d
d
d直到
d
=
1
d=1
d=1,增量可以选择
,
n
2
,
,
n
4
,
n
8
.
.
.
1
,\frac{n}{2},,\frac{n}{4},\frac{n}{8}...1
,2n,,4n,8n...1
void shell_sort(int a[], int n) {
for (int d = n / 2; d >= 1; d = d / 2) {
for (int i = d + 1; i <= n; i++) {
if (a[i] < a[i - d]) {
a[0] = a[i];
int j = 0;
for (j = i - d; j > 0 && a[0] < a[j]; j -= d) {
a[j + d] = a[j];
}
a[j + d] = a[0];
}
}
}
}
选择排序
冒泡排序
void bubble_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
bool flag = false;
for (int j = n - 1; j > i; j--) {
if (a[j - 1] > a[j]) {
swap(a[j - 1], a[j]);
flag = true;
}
}
if (!flag) return;
}
}
归并排序
快速排序
计数排序
桶排序