好久好久没学了,慢慢把一点点地补起来吧
快速排序
主要思想:分治
第一步:
确定分界点x=q[l]或q[r]或q[(l+r)/2]或随机 都可以
第二步:
调整区间:使左边的所有数都<=x,右边的所有数都>=x
第三步:
递归处理左右两段
时间复杂度最坏为O(n^2) 平均为O(nlogn)
上述第二步的具体方法
第一种方法(暴力 需要额外的空间)
第一步:开两个空数组a[],b[]
第二步:扫描整个q[],将<=x的元素放到a[]中,所有>x的元素放到b[]中
第三步:先将a[]中的元素放到q[]中,再将b[]中的元素放到q[]中
第二种方法(优美 不需要额外的空间)
两个指针i和j,i从最左边开始,如果指向的数<x,就前进,否则停下,j就从右边开始,如果指向的数>x,就前进,否则,将i和j指向的元素swap,直到两个指针相遇
模板:
记住一个模板即可避免边界问题
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int x = q[(l + r)/2], i = l - 1, j = r + 1;
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}