快速排序(分治法O(nlogn))

划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于等于右边的任意元素。
递归求解:把左右两部分分别排序。
合并问题:不用合并,因为此时数组已经完全有序。

void qsort(int L,int R){
    if(L>=R)return;
    int l=L,r=R;
    int key=a[l];//取a[l]为关键字

    while(l<r){
        while(l<r&&a[r]>=key)r--;
        a[l]=a[r];    //由于a[l]最初被保存在key中,所以可以被覆盖

        while(l<r&&a[l]<=key)l++;
        a[r]=a[l];    //由于先执行了第8行,所以a[r]在这里可以被覆盖
    }
    a[l]=key;

    qsort(L,l-1);//对分界点左边快排
    qsort(l+1,R);//对分界点右边快排
}

如果将“划分问题”单独写成一个函数,程序会清爽些:

int part(int l,int r){//排序并返回分界点
    int key=a[l];
    while(l<r){
        while(l<r&&a[r]>=key)r--;
        a[l]=a[r];

        while(l<r&&a[l]<=key)l++;
        a[r]=a[l];
    }
    a[l]=key;
    return l;
}

void qsort(int l,int r){
    if(l>=r)return;
    int p=part(l,r);
    qsort(l,p-1);//对分界点左边快排
    qsort(p+1,r);//对分界点右边快排
}

你可能感兴趣的:(快速排序(分治法O(nlogn)))