快速排序是一种分治的排序算法,每次从数组中选一个数作为主元,使左边的一部分都小于等于它,右边的一部分都大于等于它,然后再递归把左右两边分别排序,一般效率是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);
}
这就是一种方法,但如果数组本来就是有序的,那样每次都要交换一遍,效率就成O(n^2)了,所以可以每次不选最后一个为主元,而是随机选一个然后和最后一个交换。做法是在前面加上
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);
}
当然最方便的是直接用qsort或sort,qsort是C里的快排,sort是C++STL里的,是优化了的快排,sort应该是快一点点吧。。。qsort就不说了,来说下sort。
首先要有头文件#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不能省略。