算法基础课笔记and题解汇总
笔记:
快速排序基于分治思想。
步骤如下:
1. 确定分界点x,x=(l+r)/2。
2. 调整区间(重点):把区间状态修改为:x左边的数小于x,右边的数大于x。
3. 递归处理左右两端,注意处理l>=r的边界情况,要return。
如何处理第二步重点?
1. 设i在l−1位置,j在r+1位置。
2. 移动指针i,直到碰到一个大于x的数。
3. 移动指针j,直到碰到一个小于x的数。
4. swap(ai,aj)
5. 重复执行2~4步,直到ij相遇。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, a[100010];
void quick_sort(int l, int r) {
if (l >= r) return;
int mid = l + r >> 1;
int i = l - 1, j = r + 1, x = a[mid];
while (i < j) {
do i++; while (a[i] < x);
do j--; while (a[j] > x);
if (i < j) swap(a[i], a[j]);
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
quick_sort(1, n);
for (int i = 1; i <= n; i++) cout << a[i] << " ";
return 0;
}
总结:还是sort快亿点