实现快排最优版本算法上机报告课件资料.docx

上传人:b****2 文档编号:24322743 上传时间:2023-05-26 格式:DOCX 页数:12 大小:67.19KB
下载 相关 举报
实现快排最优版本算法上机报告课件资料.docx_第1页
第1页 / 共12页
实现快排最优版本算法上机报告课件资料.docx_第2页
第2页 / 共12页
实现快排最优版本算法上机报告课件资料.docx_第3页
第3页 / 共12页
实现快排最优版本算法上机报告课件资料.docx_第4页
第4页 / 共12页
实现快排最优版本算法上机报告课件资料.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实现快排最优版本算法上机报告课件资料.docx

《实现快排最优版本算法上机报告课件资料.docx》由会员分享,可在线阅读,更多相关《实现快排最优版本算法上机报告课件资料.docx(12页珍藏版)》请在冰豆网上搜索。

实现快排最优版本算法上机报告课件资料.docx

实现快排最优版本算法上机报告课件资料

算法导论第二次上机报告

班级:

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)

ifp

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[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)

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)

while

(1)

j=j-1

ifa[j]=x

break

while

(1)

i=i+1

ifa[i]>=x

break

ifi

swap(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)

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]>=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

四、算法分析

采用循环控制结构,用尾递归替换原算法中的第二个递归。

五、测试结果

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1