- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《程序设计》多媒体教程
第八讲
第四章 数组、字符串、指针及其应用
4.2.7 一维数组算法示例
※ 排序算法
排序算法是最常用最基本的一种计算机算法。
排序是指对一个数据序列进行处理,使得该序列中的数据按照一定规律按次序排列。最
简单的排序是整数的升序或者降序排列。
例如,序列{8, 4, 3, 6, 9, 2, 7}的升序排序为{2, 3, 4, 6, 7, 8, 9} 。
排序有许多种算法,例如插入法、选择法、冒泡法、快速法、合并法(归并法)、二分法、
杂凑法、希尔法、基数法( 口袋法)、二进制基数( 口袋)法、链接口袋法, 等等。
不同的排序算法有不同的特点,各自有不同的适应性。在今后课程中需要学习的排序算
法主要包括插入法、选择法、冒泡法、快速法、合并法(归并法)。
本例使用的是冒泡法。
※ 冒泡排序法
冒泡排序算法的基本思想是逐次在未排序的数据序列中挑选出最大的数,放到未排序序
列的最后。同时使得未排序的数据逐渐减少,直到所有数据都完成排序为止。
冒泡算法要进行若干次循环。对于每次处理的n个未排序的数据,对两个相邻的数据逐
对进行比较,并且将较大的数不断地向后移,使得最大的必然被移到最后。然后令n减1,
开始下一次循环。直至n==1(未排序的数据个数为1)时结束。
例如,用冒泡法对数据序列{7, 8, 4, 5, 1}排序的过程为:
Step 1 : {7, 8, 4, 5, 1} = {7, 4, 8, 5, 1}
= {7, 4, 5, 8, 1} = {7, 4, 5, 1, 8} 使8移到最后
Step 2 : {7, 4, 5, 1, 8} = {4, 7, 5, 1, 8}
= {4, 5, 7, 1, 8} = {4, 5, 1, 7, 8} 使7移到未排序的四个元素最后
Step 3 : {4, 5, 1, 7, 8} = {4, 1, 5, 7, 8} 使5移到未排序的三个元素最后
Step 4 : {4, 1, 5, 7, 8} = {1, 4, 5, 7, 8} 使4移到未排序的两个元素最后
其中,下划线表示向后交换的元素,粗体表示已排序的元素。
可见,冒泡排序类似于水中的气泡逐个向水面上冒出的过程。
【例4.10(p81/p74) 】用冒泡法对n个数据进行排序。
⊙ 题意
输入一批数据到数组,对数组的元素用冒泡法排序,然后输出。
⊙ 冒泡排序的基本算法
采用两个循环,外循环进行n-1次,每次对n, n-1, …, 2个数实现一次冒泡过程。内循环
进行i-1次,对相邻的数两两比较并且按需进行交换。
冒泡排序函数bubble1()如下:
void bubble1(short a[], short n)
{
int i, j;
for(i=n-1; i0; i- -) /* 需要循环n-1 次 */
for(j=0; ji; j++) /* 每次循环需要比较i-1次 */
if(a[j] a[j+1])
swap2(a[j], a[j+1]); /* 交换a[j]和a[j+1] */
}
⊙ 对冒泡算法的分析
观察对数据序列{1, 7, 8, 4, 5}进行冒泡排序的过程
可以发现,在第二次循环后,实际上已经完成排序,后两轮可以不做了。
特别的,对数据序列{1, 4, 5, 7, 8}进行冒泡排序时,虽然该数据序列已排序,冒泡法还
是要作n-1次循环。说明对于一个数据序列,如果存在某些子序列是已排序的话,应该可以
节省循环的次数的。问题在于冒泡法的基本算法中外循环的次数是固定的。
例如,对于{7, 4, 1, 5, 8},在第一次外循环后得{4, 1, 5, 7, 8},可以发现不仅仅是得到
原创力文档


文档评论(0)