快速排序是一种分治的排序算法,每次从数组中选一个数作为主元,使左边的一部分都小于等于它,右边的一部分都大于等于它,然后再递归把左右两边分别排序,一般效率是O(nlgn)。
一种方法是每次选择排序区间的最后一个元素作为主元。
void Qsort(int x,int y) //[x,y]是排序区间,a[y]是主元 { if(x>=y) return; int t,i=x-1,j=x; //i+1之前的都小于等于主元,j是当前判断的元素的位置 while(j<y) { if(a[j]<a[y]) //如果比主元小就要放到前面,让i+1,然后交换a[i],a[j] { i++; t=a[i]; a[i]=a[j]; a[j]=t; } j++; } t=a[i+1]; //最后交换主元和a[i+1] a[i+1]=a[y]; a[y]=t; Qsort(x,i); Qsort(i+2,y); }
int
k=
rand
()%(y-x+1)+x;
t=a[k];a[k]=a[y];a[y]=t;
快速排序的另一种主元位置随时在变的优化的写法
void Qsort(int x,int y) { if(x>=y) return; int t,i=x,j=y; //i是从左边开始,j从右边开始 int p=(x+y)/2,k=a[p]; //选取中间的元素作为主元,p是主元位置,k是主元的值 while(i<j) //每次保证i之前的元素小于等于k,j之后的元素大于等于k { while(i<=p&&a[i]<=k)i++; if(i<p) { a[p]=a[i]; p=i; } while(j>=p&&a[j]>=k)j--; if(j>p) { a[p]=a[j]; p=j; } a[p]=k; } Qsort(x,p-1); Qsort(p+1,y); }
首先要有头文件#include<algorithm>
,sort(首地址,尾地址,比较函数(可以不写)),不写排序函数就是升序。比如对从a[0]到a[N-1]排升序,就是sort(a,a+N)。如果想降序就写个比较函数。
bool cmp(int a,int b){
return a>b;}
如果是结构体
struct node
{
int x,y;
}
比较函数就可以写成
bool cmp(node a,noede b){
return a.x>b.x;}
其实要是在C语言里面如果不用typedef的话struct不能省略。