实现快排最优版本算法上机报告课件资料.docx
《实现快排最优版本算法上机报告课件资料.docx》由会员分享,可在线阅读,更多相关《实现快排最优版本算法上机报告课件资料.docx(12页珍藏版)》请在冰豆网上搜索。
实现快排最优版本算法上机报告课件资料
算法导论第二次上机报告
班级:
1403018姓名:
张可心学号:
14030188030
(一)题目一
一、问题
Thisprojectrequiresyoutoimplementanoptimizedversionofquicksort,andcomparetheperformancesofthefollowingcombinations:
(1)Cutoffvaluesfrom0to50;
(2)Takepivottobethe1stelement,random,medianofrandomthree,andmedianofrandomfive.
Thetestsmustbedoneonthefollowingthreekindsofinputs:
(1)sortedinput;
(2)reverse-orderedinput;
(3)randominput.
Thesizeofinputcanbetakenfrom1000to10000.Theruntimesmustbeplottedwithrespecttothesizestoillustratethedifference.(figureoutusingexcel,matlabintheReport)
二、问题分析
实现快排的最优版本,分别选取第一个数,随机数,三个随机数的中位数,五个随机数的中位数为基数,设置顺序,随机,逆序三种形式,用_qsort(inta[],intp,intr,intnumber)和Partition(inta[],intp,intr,intnumber)俩函数进行排序。
三、算法伪代码
void_qsort(a,p,r,number)
ifpq=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[1]=rand()%(r-p+1)+p;
b[2]=rand()%(r-p+1)+p;
b[3]=rand()%(r-p+1)+p;
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);
cout<<"序列的顺序(1顺序;2随机;3逆序):
";
ints;
cin>>s;
if(s==3)
sort(a+1,a+1+n,greater());//对生成数进行排列
elseif(s==1)
sort(a+1,a+1+n);
elseif(s==2){
}
else{
}
cout<<"确定基数:
1,第一个数;2,随机数;3,3个随机数的中位数;4,5个随机数的中位数:
";
intnumber;
cin>>number;
clock_tstart,end;//计时
start=clock();
_qsort(a,1,n,number);
end=clock();
cout<<"用时:
"<for(inti=1;i<=n;i++)
{
cout<}
return0;
}
四、算法分析
对数据进行快排,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
五、测试结果
1以第一个数为基数的排序时间,单位ms.
2以随机数为基数的排序时间,单位ms
3以三个随机数的中位数为基数的排序时间,单位ms
4以五个随机数的中位数为基数的排序时间,单位ms
(二)题目二
一、问题
ImplementHoare’salgorithmandcompareitwithouralgorithminthetextbook.(体会有重复数据情况下,算法之间的优劣)。
Theinputisalsotakenform1000and10000(between0and50),andthetestsshouldbedoneontherandominput.Theruntimesmustbeplottedwithrespecttothesizestoillustratethedifference.(figureoutusingexcel,matlabintheReport)
二、问题分析
实现Hoare快排算法,并和我们的快排算法相比较,即体会重复数据情况下,算法的优劣。
三、算法伪代码
void_qsort(a,p,r)
ifpq=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)
while
(1)
j=j-1
ifa[j]=x
break
while
(1)
i=i+1
ifa[i]>=x
break
ifiswap(a[i],a[j])
else
returnj
main()
intn,a[200000]
cout<<"输入数据多少:
"
cin>>n
forinti=1i<=ni=i+1
a[i]=random(51)
clock_tstart,end
start=clock()
_qsort(a,1,n)
end=clock()
cout<<"运行时间:
"<forinti=1i<=ni=i+1
cout<return0
四、算法分析
相较原本算法,对Partition部分进行改变,原算法中,主元是与它所划分的两个分区分离的,而Hoare_Partition中主元是存在于两分区中的。
五、测试结果
(三)题目三
一、问题
Implementquicksortalgorithmusingtailrecursionandcompareitwiththeoriginalquicksortalgorithm.
Theinputisalsotakenform20000and100000(between0and50),andthetestsshouldbedoneontherandominput.Theruntimesmustbeplottedwithrespecttothesizestoillustratethedifference.(figureoutusingexcel,matlabintheReport)
二、问题分析
用尾递归实现快排,并和普通快排相比较,输入规模在1000-10000,用运行时间和规模建立关系来显示不同。
三、算法伪代码
voidTail_qsort(a,p,r)
whilepq=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]>=x
i=i-1
swap(a[i],a[j])
swap(a[i-1],a[p])
returni-1
main()
intn,a[200000]
cout<<"输入数据多少:
"
cin>>n
for(inti=1;i<=n;i++)
a[i]=random(51)
clock_tstart,end
start=clock()
Tail_qsort(a,1,n)
end=clock()
cout<<"运行时间:
"<fori=1i<=ni=i+1
cout<return0
四、算法分析
采用循环控制结构,用尾递归替换原算法中的第二个递归。
五、测试结果