您的位置:首页 > 其它

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

2016-03-15 19:35 281 查看
划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于等于右边的任意元素。

递归求解:把左右两部分分别排序。

合并问题:不用合并,因为此时数组已经完全有序。

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);//对分界点右边快排
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: