快速排序

来源:互联网 发布:淘宝网苹果6不带指纹 编辑:程序博客网 时间:2024/05/10 00:01

快速排序把数据a[p,r]分成a[p,q-1],a[q+1,r]两个小数组进行排序,将小于a[q]的放于数组前半部分,后面放大着,此时的a[q]的位置已经确定好。采用递归调用对a[p,q-1],a[q+1,r]进行排序,直到顺序排完。

根据采用数组中哪个数据作为分组的依据,衍生出快速排序的随机版本,即在数组中随机选取数据a[i]作为分组依据。

#include<iostream>#include<stdlib.h>#include<time.h>using namespace std;int partition(int *a,int p,int r){if(p>r)cout<<"error";int x=a[r-1];int i=p-1;for(int j=p;j<r-1;++j){if(a[j]<=x){i++;int tmp=a[i];a[i]=a[j];a[j]=tmp;}}int tem=a[i+1];a[i+1]=a[r-1];a[r-1]=tem;return i+1;}void quicksort(int *a ,int p,int r){int q;if(p<r){q=partition(a,p,r);quicksort(a,p,q-1);quicksort(a,q+1,r);}}int randpartition(int *a,int p,int r){if(p<r){srand((int)time(0));int i=p+rand()%(r-p)+1;int tem=a[r-1];a[r-1]=a[i];a[i]=tem;return partition(a,p,r);}}void randsort(int *a,int p,int r){int q;if(p<r){q=randpartition(a,p,r);randsort(a,p,q-1);randsort(a,q+1,r);}}int main(){int num[10]={13,19,9,5,12,8,7,21,6,11};quicksort(num, 0, 10);for(int i=0;i<10;++i)cout<<num[i]<<" ";cout<<endl;int num1[10]={13,19,9,5,12,8,7,21,6,11};randsort(num1,0,10);for(int i=0;i<10;++i)cout<<num1[i]<<" ";cout<<endl;}


原创粉丝点击