实现快排最优版本算法上机报告Word文件下载.docx
《实现快排最优版本算法上机报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《实现快排最优版本算法上机报告Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
三、算法伪代码
void_qsort(a,p,r,number)
ifp<
r
q=Partition(a,p,r,number)
_qsort(a,p,q-1,number)
_qsort(a,q+1,r,number)
intPartition(inta[],intp,intr,intnumber)
{
intx,temp;
if(number==1)
{
temp=p;
}
elseif(number==2)
temp=rand()%(r-p+1)+p;
elseif(number==3)
intb[5];
b[1]=rand()%(r-p+1)+p;
b[2]=rand()%(r-p+1)+p;
b[3]=rand()%(r-p+1)+p;
sort(b+1,b+4);
temp=b[2];
elseif(number==4)
intb[10];
b[4]=rand()%(r-p+1)+p;
b[5]=rand()%(r-p+1)+p;
sort(b+1,b+6);
temp=b[3];
else{
temp=p;
x=a[temp];
swap(a[temp],a[p]);
inti=r+1;
for(intj=r;
j>
p;
j--)
if(a[j]>
=x)
{
i--;
swap(a[i],a[j]);
swap(a[i-1],a[p]);
returni-1;
}
intmain()
intn,a[200000];
cout<
<
"
测试数据:
;
cin>
>
n;
for(inti=1;
i<
=n;
i++)
a[i]=random(51);
序列的顺序(1顺序;
2随机;
3逆序):
ints;
s;
if(s==3)
sort(a+1,a+1+n,greater<
int>
());
//对生成数进行排列
elseif(s==1)
sort(a+1,a+1+n);
elseif(s==2){
}
确定基数:
1,第一个数;
2,随机数;
3,3个随机数的中位数;
4,5个随机数的中位数:
intnumber;
number;
clock_tstart,end;
//计时
start=clock();
_qsort(a,1,n,number);
end=clock();
用时:
end-start<
ms"
endl;
cout<
a[i]<
"
return0;
四、算法分析
对数据进行快排,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
五、测试结果
1以第一个数为基数的排序时间,单位ms.
2以随机数为基数的排序时间,单位ms
3以三个随机数的中位数为基数的排序时间,单位ms
4以五个随机数的中位数为基数的排序时间,单位ms
(二)题目二
ImplementHoare’salgorithmandcompareitwithouralgorithminthetextbook.(体会有重复数据情况下,算法之间的优劣)。
Theinputisalsotakenform1000and10000(between0and50),andthetestsshouldbedoneontherandominput.Theruntimesmustbeplottedwithrespecttothesizestoillustratethedifference.(figureoutusingexcel,matlabintheReport)
实现Hoare快排算法,并和我们的快排算法相比较,即体会重复数据情况下,算法的优劣。
void_qsort(a,p,r)
ifp<
q=Hoare_Partition(a,p,r);
_qsort(a,p,q-1);
_qsort(a,q+1,r);
Hoare_Partition(a,p,r)
x=a[p]
i=p-1
j=r+1
while
(1)
j=j-1
ifa[j]=x
break
i=i+1
ifa[i]>
=x
ifi<
j
swap(a[i],a[j])
else
returnj
main()
intn,a[200000]
输入数据多少:
n
forinti=1i<
=ni=i+1
a[i]=random(51)
clock_tstart,end
start=clock()
_qsort(a,1,n)
end=clock()
运行时间:
endl
forinti=1i<
cout<
return0
相较原本算法,对Partition部分进行改变,原算法中,主元是与它所划分的两个分区分离的,而Hoare_Partition中主元是存在于两分区中的。
(三)题目三
Implementquicksortalgorithmusingtailrecursionandcompareitwiththeoriginalquicksortalgorithm.
Theinputisalsotakenform20000and100000(between0and50),andthetestsshouldbedoneontherandominput.Theruntimesmustbeplottedwithrespecttothesizestoillustratethedifference.(figureoutusingexcel,matlabintheReport)
用尾递归实现快排,并和普通快排相比较,输入规模在1000-10000,用运行时间和规模建立关系来显示不同。
voidTail_qsort(a,p,r)
whilep<
q=Partition(a,p,r)
Tail_qsort(a,p,q-1)
p=q+1
Partition(a,p,r)
x=a[p]
i=r+1
forintj=rj>
pj=j-1
ifa[j]>
i=i-1
swap(a[i],a[j])
swap(a[i-1],a[p])
returni-1
main()
start=clock()
Tail_qsort(a,1,n)
fori=1i<
采用循环控制结构,用尾递归替换原算法中的第二个递归。