您的位置:首页 > 其它

快速排序

2012-09-29 21:30 225 查看
#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

int z[100],n;

//快速排序的思想是递归
//以当前区间中的某个元素为基准 将比它小的放到前面 比它的放到后面 这样之后可以分而治之 因为以它为一个值的分界已经将比它小的放到了前半部分 比它大的放到了后面部分 这样便可以又对前半部分和后半部分执行同样的递归操作 最终完成排序

void qsort(int a,int b)//当前要处理a-b这个区间
{
int c=a,d=b;
int e=z[(a+b)>>1];//e是基准值 我们取这个区间中间的值作为基准值 当然其他的值也可以
int f;//f仅作为交换元素时的一个辅助变量
while(c<=d)//如果中间还有一段没有处理
{
while(z[c]<e)
c++;//找到一个大于等于基准值的数
while(z[d]>e)
d--;//找到一个小于等于基准值的数
if(c<=d)//如果较大的那个数在较小的那个数之前 我们就需要交换这两个数的位置
{
f=z[c];
z[c]=z[d];
z[d]=f;//交换
c++;
d--;
}
}
//这样做完一次之后 我们可以保证 (d+1)到(c-1)这个区间内的元素是有序的
if(c<b) qsort(c,b);//处理左边还未排序的区间
if(a<d) qsort(a,d);//处理右边还未排序的区间
}

int main()
{
scanf("%d",&n);//读入有多少个数
for (int a=1;a<=n;a++)
scanf("%d",&z[a]);//读入每一个数
qsort(1,n);//我们需要处理1-n这个区间里的所有数
//sort(z+1,z+n+1);//这是c++自带的那个函数 需要在前面加上 #include<algorithm>
for (int a=1;a<=n;a++)
printf("%d\n",z[a]);//输出

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: