一开始我真没把这种大一就要看的东西当回事,直到我自己听完课写了一遍,改了一晚上错。
还是有很多地方要注意的,就像书上那么多错误二分,都是尝试得到的。
#include<bits/stdc++.h>
using namespace std;
void Swap(int &a,int &b)
{
int tep=a;
a=b;
b=tep;
}
void Quicksort(int a[],int l,int r)
{
if(l>=r)
return ;
int select=rand()%(r-l+1)+l;
int t=a[select];
Swap(a[select],a[l]);//将随机选择的比较数字放在最前面,因为那个位置实际上是空的,放在里面相
//当于又加上去一个比较数字
int i=l,j=r+1;
while(i<j)
{
while(a[++i]<=t && i<=r);//这里while里的a[]<=t可以改成<
//<=实际上是缩小了范围,减少了重复数字交换
//但后面的j为了保证能找到第一个小于等于比较数字的数字,不能加=
while(a[--j]>t && j>=l);
if(i<j)
Swap(a[i],a[j]);
}
a[l]=a[j];//将比较数字与最后一个小于等于比较数字的交换
a[j]=t;//中间的即为比较数字自己
Quicksort(a,l,j-1);
Quicksort(a,j+1,r);
}
int main()
{
int a[10]={1,5,7,-2,-4,3,0};
Quicksort(a,0,6);
for(int i=0;i<=6;i++)
printf("%d%s",a[i],i==6?"\n":" ");
return 0;
}
下面是例题,用于检测程序,HDU1425
sort
Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 60315 Accepted Submission(s): 16645
Problem Description