快速排序

题目链接

tips:

分治思想的应用:

用O(n)的时间先分成两半,然后左半边快排,右半边快排

数组排序任务可以如下完成:
1)设k=a[0], 将k挪到适当位置,使得比k小的元素都
在k左边,比k大的元素都在k右边,和k相等的,不关心
在k左右出现均可 ( O( n)时间完成)---奇偶次交换
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序

1.快排有好多种实现方式

2.用快排算法变形来做的题好像只有求第k大数了?待补


 

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e6+10;
int n;
int q[N];
void quick_sort(int q[],int l, int r){
    if(l >= r) return ;

    int k=q[l];
    //单独存下k,比较的标杆定值,可以避免考虑随着交换而移动
    //a[i]或者a[j]中始终有一个为k
    int i = l, j = r;//指针i、j;指针指示位置

    /*
    动i还是j:看有序区间而定,目的是k的左边比k小,k的右边比k大
    */

    while(i != j){
        while(j > i && q[j] >= k )
            --j;
        swap(q[i],q[j]);
        while(i < j && q[i] <= k )
            ++i;
        swap(q[i],q[j]);
    }//处理完后,a[i]=k;
    quick_sort(q,l,i-1);
    quick_sort(q,i+1,r);
}


int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);

    quick_sort(q,0,n-1);

    for(int i = 0; i < n;i++) printf("%d ",q[i]);
    return 0;
}
View Code

 

 

备忘:可以看mooc和yxc温习

posted @ 2019-05-29 22:49  SUMay  阅读(154)  评论(0编辑  收藏  举报