双向起泡的排序算法.docx
- 文档编号:1337284
- 上传时间:2022-10-20
- 格式:DOCX
- 页数:10
- 大小:257.52KB
双向起泡的排序算法.docx
《双向起泡的排序算法.docx》由会员分享,可在线阅读,更多相关《双向起泡的排序算法.docx(10页珍藏版)》请在冰豆网上搜索。
双向起泡的排序算法
双向起泡的排序算法
1.课题内容和要求
1.1课题内容:
双向起泡的排序算法,即相邻两遍向相反的方向起泡。
双向起泡排序法,向两个方向漂浮,通过一趟排序,可找出关键字“最大”和“最小”的两个记录,因而相比起泡算法速度大大提高了.
1.2要求
1)设计一个排序算法,使之拥有通过一次循环使两端得到最大数最小数的功能
2)与起泡法相比较,在时间性能上要有一个很大的突破
1.设计思路分析
2.1基本思想
起泡排序的基本思想
起泡排序易于冒泡排序算法合并,即向后推出最大数。
将被排序的记录数组R[1..n]垂
直排列,每个记录R[i]看作是重量为R[i]的气泡。
根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:
凡扫描到违反本原则的轻气泡,就使其向上“飘浮”。
如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
一般地,第i遍处理时,不必
检查第i个位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。
即就是在一组待排序的数据中,两两比较数据的大小,发现两个记录的排序次序相反时就交换位置,直到没有反序的记录为止。
也就是说它重复地走访过要排序的序列,一次比较两个项目,如果他们的顺序错误就把他们交换过来。
走访序列的工作是重复地进行直到没有再需要做交换动作,该序列已经排序完成。
一趟冒泡,至少可以把值最大的元素送到最后位置(或最上边);当然也可以倒过来做,把值小的元素向前移或向下移,一趟冒泡,至少可以把值最小的元素送到最前面的位置(或最下边)。
双向起泡排序算法思想
双向起泡排序是冒泡排序的升级版,双向起泡排序连够在一次循环中同时取得最大值与最小值,所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用。
双向起泡法和通常的冒泡法比较,两者比较次数基本相同,但数据交换的次数相差很大,双向起泡法要大大小于冒泡法。
2.2算法分析:
1,分析双向起泡排序与传统的起泡排序非常相似,只不过起泡排序对数据序列的扫描始终朝着一个方向,而双向起泡排序对数据序列的扫描是在两个方向上交替进行•双向起泡排序算法设计难度略高于起泡排序,但它使排序效率在一定范围内有一定程度的提高.上述双向起泡排序算法至少需进行1趟扫描,至多需进行n—1趟扫描,即在待排序数据初始有序(正序)情况下,关键字的比较次数为”一1,数据的移动次数为0;在待排
序数据初始逆序的情况下,关键字的比较次数为”(z—1)/2,最坏情况下,每一次比较
均会发生数据的交换,即移动次数为3n(〜1)/2.显然双向起泡排序与起泡排序算法具有相同的时间复杂度,并且在正序和逆序的情况下,所需的关键字的比较次数和移动次数完全相同.
2.性能测试比较由于渐进复杂度分析的方法不能区分具有相同时间复杂度的算法,因此
需要进行进一步测试.有研究设计者对双向起泡排序和起泡排序算法进行270延边大学学
报(自然科学版)第27卷了性能对比测试,结果如表1所示.测试所用数据均为16位非负随机数.测试结果表明,双向起泡排序与起泡排序算法的平均移动次数始终相同;而对随机给出的数据序列,双向起泡排序算法要比起泡排序算法的平均比较次数要少.由于测试程序的统计量不是运行时间,所以测试结果不依赖于具体计算机的软、硬件等环境因素,而仅与算法有关.虽然在不同的计算机硬件、软件环境下,对于不同的待排序数据序列,其运行时间的测试结果也会不同,但表中数据可以在一定程度上反映算法的性能.测试结果表明,当数据量不大时,双向起泡排序并不比起泡排序效率更高,这是由于双向起泡排序算法平均比较次数较少的优点不足以抵消其程序结构复杂所带来的额外开销,而当数据量较大时,双向起泡排序的时间性能则明显优于起泡排序运行时间的测试结果。
2.3事例比较:
初始关键字:
49
3865
97
76
13
2746
冒泡排序:
49
38
65
97
76
13
27
46
第一趟结果:
38
49
65
76
13
27
46
(97)
第二趟结果:
38
49
65
13
27
46
(76)
第三趟结果:
38
49
13
27
46
(65)
第四趟结果:
38
13
27
46(49)
第五趟结果:
13
27
38
(46)
第六趟结果:
13
27
(38)
第七趟结果:
(13)
(27)
从图中可以看出,每一趟排序,
小的记录在逐渐下沉,每一趟排序有一个关键字“最大”的记录漂浮到了水面4。
那么
能不能在一趟排序中,让关键字“最小”的也同时沉到水底呢?
这就是以下我们要介
绍的双向起泡排序法。
找出关键字次大和次小的记录。
双向起泡排序
4938
R1J
65
97
76
13
2746
第一趟结果:
1346
49
65
76
38
2797
R2J
R
7J
第二趟结果:
27
46
49
65
38
76
R3J
R6J
第三趟结果:
38
46
49
65
R4J
R5J
第四趟结果:
46
49
双向起泡法和通常的冒抱法相比较,两者数据比较的次数基本相同,但数据交换的次数相差很大,双向起泡法要大大小于冒泡法。
如对于10个记录的序列,若初始序列为
“逆序”,用冒泡法进行排序时,第一趟排序,需进行9次比较,相应的也需9次交换,才能找到关键字最大的记录;采用双向起泡排序法,进行一趟排序,需进行9次比较,1次交换,找到了关键字最大和最小的两个记录。
采用冒泡法需进行9趟排序,而采用双
向起泡法只需5趟就可以达到目的。
因而从性能上讲,双向起泡排序法大大优于通常的冒泡法,特别是对于大量的数据,就更显其优越性。
3.概要设计
3.1双向起跑排序流程图:
1)逆向起泡排序:
开始
变量赋初值:
m=0
m=r[j]r[j]=r[j-1]——r
Count++
j--
2)正向起泡排序:
开始
变量赋初值:
s=0
s=r[j]r[j]=r[j+1]r[j+1]=s
Count++
j++
3.2类中成员变量和成员函数原型声明
Sort(intr[],intm[],intn);
//构造函数,建立排序数组,采用顺序存储结构实现
voidBiBubble(intr[],intn);
//双向起泡排序算法
voidprint(intn,intr[]);
//输出排好序的数组
4.详细设计
4.1源程序设计
1)构造函数
Sort:
:
Sort(intr[],intm[],intn)//函数的传值调用显得尤为重要,这是函数的入口,注意
形参中的参数必须和程序中的参数是一致的,不然的话就会出现未定义
{
cout<<"实际输入的元素个数为"<<*<"个"< r[0]=0; for(inti=1;i 进入数组导致,输入元素比实际的少一个,因此循环加1 { cout<<"请输入你要是排序的第"< "; cin>>r[i]; m[i]=r[i]; } cout<<"您输入的元素如下: "; for(i=1;i cout< cout< } 2)双向起泡排序函数 voidSort: : BiBubble(intr[],intn) { intflag,i,j; intcount=0; flag=1; while(flag==1) { flag=0;i=0; for(j=n-i;j>i;j--)〃逆向起泡排序,这里的j为n-i从最后一个元素开始比较 { if(r[j-1]>r[j]) { flag=1; intm; m=r[j]; r[j]=r[j-1]; r[j-1]=m; count++; }〃发生了交换,故将交换标志置为真 //正向起泡排序 } for(j=i+1;j { if(r[j]>r[j+1]) { flag=1; ints; s=r[j]; r[j]=r[j+1]; r[j+1]=s; count++; } } i++; } cout<<"比较的次数是: "< } 3)输出排好序的数组 voidSort: : print(intn,intr[]){ for(inti=1;i } 4)mian函数 voidmain() //辅助初始数组 //待排序数组 〃全局变量以便调用 { intb[MaxSize]; inta[MaxSize]; intn; cout<<"请输入你需要双向起泡排序的数据的个数: cin»n; Sorts(a,b,n); s.BiBubble(a,n); s.print(n,a);cout< } 5.测试数据及其结果分析 5.1系统功能测试的数据和测试结果测试一: 5.2结果分析 1)测试一: 47036 预计结果为: 03467 需要进行5次比较: 47036 第一次: 40736 第二次: 04736 第三次: 04376 第四次: 04367 第五次: 03467 结果与预计结果相符。 2)测试二: 94617 预计结果: 14679 需要比较次数: 6 第一次: 94167 第二次: 91467 第三次: 19467 第四次: 14967 第五次: 14697 第六次: 14679 结果与预计结果相符,由此得知,此函数是可以进行双向起泡排序的 6.调试过程中的问题 6.1将起泡法改进为双向起泡排序算法 起泡法,一般都是一次循环找到最大数,然后第二次循环找到次大数,以此类推,从而得到一个从小到大的排序结果。 然而这样的排序所用的时间相比较长。 我从起泡排序的基础上,对程序进行一定修改,把正向与反向排序结合起来,在一个大循环里运行小循环,从而缩短了时间,尤其在所要进行一次大数目的排序任务时。 分析上面的程式段我们能够发现反向起泡时第一次循环找出了最小数,正向起泡第一次循环找到最大数。 很显然在一次循环中即能够找到一个最小的数还能够找到一个最大的数,所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用。 7.专业课程设计总结 通过本次课程设计,我所做的作业双向起泡排序算法,让我更深入的理解了排序算法,从刚开始的需求分析,我在以前的数据结构书中寻找算法思想,还在网上寻求他人的不同见解。 然后开始根据之前的思路进行源程序编码,运用自己不熟练的编程技术,解决一个又一个问题。 个人认为,在编程中,总会出现很多小错误。 例如,cin与cout这种简单的语法问 题,或者把流程图转换为for循环中出现的问题。 即使是一个简单的排序算法,也有值得我们去探索的地方,寻找简单又有效又效率咼的程序,是本次实验我所追求的目标,通过本次课程设计,然我更熟悉了VC环境并了解了从初学者到高手的距离是多么的远
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双向 起泡 排序 算法