快排步骤
- 确定分界点
- 调整区间
- 递归处理左右区间
快速排序知识点
- 快排是分治思想
- 递归处理要有结束条件
- n分成0和n,或 n分成n和0,这会造成无限划分
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),具体分析见归并排序笔记
如何将快排变成稳定的
将每一个数字都变成不同的,可以使用pair<a[i], i>
循环主体:
while(i < j)//注意这里是i和j的关系不是l和r啊!!
{
do i ++; while(q[i] < x);//没有等号
do j --; while(q[j] > x);
if(i < j) swap(q[i], q[j]);//有if
}
注意边界 do while里面的判断没有等号,swap之前要判断i < j
。
while中没有等号的原因:
假设q[l..r]
全相等,
则执行完do i++; while(q[i] <= x);
之后,i会自增到r+1,
然后继续执行q[i] <= x
判断条件,造成数组下标越界(但这貌似不会报错)
并且如果之后的q[i] <= x
(此时i > r) 条件也不幸成立,就会造成一直循环下去