- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
10.2.1 直接插入排序 1 排序思想 将待排序的记录Ri,插入到已排好序的记录表R1, R2 ,…., Ri-1中,得到一个新的、记录数增加1的有序表。 直到所有的记录都插入完为止。 设待排序的记录顺序存放在数组R[1…n]中,在排序的某一时刻,将记录序列分成两部分: ◆ R[1…i-1]:已排好序的有序部分; ◆ R[i…n]:未排好序的无序部分。 显然,在刚开始排序时,R[1]是已经排好序的。 例:设有关键字序列为:7, 4, -2, 19, 13, 6,直接插入排序的过程如下图10-1所示: 初始记录的关键字: [7] 4 -2 19 13 6 第一趟排序: [4 7] -2 19 13 6 第二趟排序: [-2 4 7] 19 13 6 第三趟排序: [-2 4 7 19] 13 6 第四趟排序: [-2 4 7 13 19] 6 第五趟排序: [-2 4 6 7 13 19] 图10-1 直接插入排序的过程 2 算法实现 void straight_insert_sort(Sqlist *L) { int i, j ; for (i=2; i=L-length; i++) { L-R[0]=L-R[i]; j=i-1; /* 设置哨兵 */ while( LT(L-R[0].key, L-R[j].key) ) { L-R[j+1]=L-R[j]; j--; } /* 查找插入位置 */ L-R[j+1]=L-R[0]; /* 插入到相应位置 */ } } 3 算法说明 算法中的R[0]开始时并不存放任何待排序的记录,引入的作用主要有两个: ① 不需要增加辅助空间: 保存当前待插入的记录R[i],R[i]会因为记录的后移而被占用; ② 保证查找插入位置的内循环总可以在超出循环边界之前找到一个等于当前记录的记录,起“哨兵监视”作用,避免在内循环中每次都要判断j是否越界。 4 算法分析 ⑴ 最好情况:若待排序记录按关键字从小到大排列(正序),算法中的内循环无须执行,则一趟排序时:关键字比较次数1次,记录移动次数2次(R[i]→R[0], R[0]→R[j+1])。 则整个排序的关键字比较次数和记录移动次数分别是: 比较次数: ∑1=n-1 n i=2 移动次数: ∑ 2=2(n-1) n i=2 ⑵ 最坏情况:若待排序记录按关键字从大到小排列(逆序),则一趟排序时:算法中的内循环体执行i-1,关键字比较次数i次,记录移动次数i+1。 则就整个排序而言: 比较次数: ∑ i= n i=2 (n-1)(n+1) 2 移动次数: ∑(i+1)= n i=2 (n-1)(n+4) 2 一般地,认为待排序的记录可能出现的各种排列的概率相同,则取以上两种情况的平均值,作为排序的关键字比较次数和记录移动次数,约为n2/4,则复杂度为O(n2) 。 10.2.2 其它插入排序 1 折半插入排序 当将待排序的记录R[i] 插入到已排好序的记录子表R[1…i-1]中时,由于R1, R2 ,…, Ri-1已排好序,则查找插入位置可以用“折半查找”实现,则直接插入排序就变成为折半插入排序。 ⑴ 算法实现 void Binary_insert_sort(Sqlist *L) { int i, j, low, high, mid ; for (i=2; i=L-length; i++) { L-R[0]=L-R[i]; /* 设置哨兵 */ low=1 ; high=i-1 ; while (low=high) { if ( LT(L-R[0].key, L-R[mid].key) ) high=mid-1 ; else low=mid+1 ; } /* 查找插入位置 */ for (j=i-1; j=high+1; j--) L-R[j+1]=L-R[j]; L-R[high+1]=L-R[0]; /* 插入到相应位置 */ } } 从时间上比较,折半插入排序仅仅减少了关键字的比较次数,却没有减少记录的移动次数,故时间复杂度仍然为O(n2) 。 ⑵ 排序示例 设有一组关键字30, 13, 70, 85,
您可能关注的文档
最近下载
- 陈永鑫《茉莉花二重奏》吉他谱.pdf VIP
- 购买社会组织服务-社会救助照料支持服务方案投标文件(技术标).doc
- PowerFlex 700变频器用户手册(中文).pdf
- 年产15万平米水泥预制板生产建设项目环评环境影响报告表(新版环评).pdf VIP
- BOSS效果器GT8音色.doc VIP
- BOSS GT-8中文说明书.pdf
- 医学科研方向研究进展汇报.pptx
- 地球表部圈层相互作用.ppt
- 通用汽车网络安全随机数生成规范CYS9000 - Random Number Generator Security.pdf VIP
- 地球科学概论 第10讲 _生物圈——[武汉大学 地球科学概论].pdf VIP
文档评论(0)