疾速排序
不稳固
void quick_sort(int q[], int l, int r) {if (l >= r) return;
// 位移和按位逻辑运算优先级低于加减
int i = l - 1, j = r + 1, pivot = q[l + r >> 1];
while (i < j) {while (q[ ++ i] < pivot);
while (q[ -- j] > pivot);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
归并排序
稳固
void merge_sort(int q[], int l, int r) {if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++] = q[i ++];
else tmp[k ++] = q[j ++];
while (i <= mid) tmp[k ++] = q[i ++];
while (j <= r) tmp[k ++] = q[j ++];
for (i = l, j = 0; i <= r; i ++, j ++) q[i] = tmp[j];
}
希尔排序
不稳固
void shell_sort(int q[], int n) {
int i, j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (i = gap; i < n; i ++)
for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
swap(a[j], a[j + gap]);
}
堆排序
不稳固
void down(int u) {
int t = u;
if (u * 2 <= cnt && h[u * 2] < h[t])
t = u * 2;
if (u * 2 + 1 <= cnt && h[u * 2 + 1] < h[t])
t = u * 2 + 1;
if (u != t) {swap(h[u], h[t]);
down(t);
}
}
void heap_sort(int h[], int n) {for (int i = n / 2; i; i --) {down(i);
}
int cnt = 1;
while (m --) {ans[cnt ++] = h[1];
h[1] = h[n --];
down(1);
}
}