快速排序O(nlogn)
面试:手写快排
基于’‘分治’': 分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
-
步骤:
-
1.确定分界点x: x = q[( l + r) >> 1] (任取,个人习惯取中点)
2.用 双指针调整区间:保证x左边的数 小于等于x,x右边的数 大于等于x,注意分界点上的数不一定是x
3.递归:对x左右两个区间再进行快排
模板
void quick_sort(int q[],int l,int r){
if(l >= r) return;
int i = l - 1,j = r + 1,x = (l + r) >> 1;
while(l < r){
do i ++;while(q[i] < q[x]);
do j --;while(q[j] > q[x]);
if(i < j)swap(q[i],q[j]);
}
quick_sort(q,l,j),quick_sort(q,j + 1,r);
}
详解
//每次递归传递的参数是新区间的左右端点
void quick_sort(int q[],int l,int r){
//先写递归终止条件
if(l >= r) return;
//用do...while(),需要先把指针外移一位
int i = l - 1,j = r + 1,x = (l + r) >> 1;
while(i < j){
//i从左端点开始向后遍历,直到q[i] >= x停下
do i ++;while(q[i] < q[x]);
//j从右端点开始向前遍历,直到q[i] <= x停下
do j --;while