- 1、本文档共107页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第8章 排序;本章导读;8.1 排序的基本概念;假设含有n个记录的序列为:
{R1,R2 ,…,Rn} (8-1)
其相应的关键字序列为:
{K1,K2 ,…,Kn}
需确定1,2, …,n的一种排序p1,p2, …,pn,使其
相应的关键字满足如下关系:
Kp1≤Kp2≤…≤Kpn (8-2)
即使得式(8-1)的序列成为一个按关键字有序的序列
{R p1,R p2 ,…,Rpn} (8-3)
这个将原有表中任意顺序的记录变成一个按关键字有序排列的过程称为排序。
;2.排序分类 ;(3) 内部排序与外部排序:在排序中,若数据表中的所有记录的排列过程都是在内存中进行的,称为内部排序。由于待排序的记录数量太多,在排序过程中不能同时把全部记录放在内存,需要不断地通过在内存和外存之间交换数据元素来完成整个排序的过程,称为外部排序。在外部排序情况下,只有部分记录进入内存,在内存中进行内部排序,待排序完成后再交换到外部存储器中加以保存。然后再将其它待排序的记录调入内存继续排序。这一过程需要反复进行,直到全部记录排出次序为止。显然,内部排序是外部排序的基础,本章先介绍内部排序的各种方法,最后再讨论外部排序。 ;8.1.2 排序算法的效率分析 ;2.空间复杂度分析 ;8.2 插入排序 ;8.2.1 直接插入排序 ;向有序表中插入记录,主要完成如下操作:
(1) 有哪些信誉好的足球投注网站插入位置。
(2) 移动插入点及其以后的记录空出插入位置。
(3) 插入记录。;void Insert_Sort(int R[],int n)
{int i,j;
for(i=2;i=n; i++) //表示待插入元素的下标
{R[0]=R[i]; //设置监视哨保存待插入元素,腾出R[i]空间
j=i-1; //j指示当前空位置的前一个元素
while(R[0].keyR[j].key)//有哪些信誉好的足球投注网站插入位置并后移腾出空
{R[j+1]=R[j];
j--; }
R[j+1]=R[0]; //插入元素
}
}; 显然,开始时有序表中只有1个记录[R[1]],然后需要将R[2]~R[n]的记录依次插入到有序表中,总共要进行n-1次插入操作。首先从无序表中取出待插入的第i个记录R[i],暂存在R[0]中;然后将R[0].key依次与R[i-1].key,R[i-2].key,…进行比较,如果R[0].keyR[i-j].key(1≤j≤i-1),则将R[i-j]后移一个单元;如果R[0].key≥R[i-j].key,则找到R[0]插入的位置i-j+1,此位置已经空出,将R[0] (即R[i])记录直接插入即可。然后采用同样的方法完成下一个记录R[i+1]的插入排序。如此不断进行,直到完成记录R[n]的插入排序,整个序列变成按关键字非递减的有序序列为止。在有哪些信誉好的足球投注网站插入位置的过程中,R[0].key与R[i-j].key进行比较时,如果j=i,则循环条件 R[0].keyR[i-j].key不成立,从而退出while 循环。由此可见R[0]起到了监视哨的作用,避免了数组下标的出界。 ;【例8-1】假设有7个待排序的记录,它们的关键字分别为23,4,15,8,19,24,15,用直接插入法进行排序。;空间性能:该算法仅需要一个记录的辅助存储空间,空间复杂度为O(1)。
时间性能:整个算法执行for循环n-1次,每次循环中的基本操作是比较和移动,其总次数取决于数据表的初始特性,可能有以下几种情况:
(1)当初始记录序列的关键字已是递增排列时,这是最好的情况。算法中while语句的循环体执行次数为0,因此,在一趟排序中关键字的比较次数为1,即R[0]的关键字与R[j]的关键字比较。而移动次数为2,即R[i]移动到R[0]中,R[0]移动到R[j+1]中。所以,整个排序过程中的比较次数和移动次数分别为(n-1)和2×(n-1), 因而其时间复杂度为O(n)。 ;(2)当初始数据序列的关键字序列是递减排列时,这是最坏的情况。在第i次排序时, while语句内的循环体执行次数为i。因此,关键字的比较次数为i,而移动次数为i+1。所以,整个排序过程中的比较次数和移动次数分别为:;8.2.2 折半插入排序 ; 设置始指针low,指向有序表的第一个记录,尾指针high,指向有序表的最后一个记录,中间指针mid指向有序表中间位置的记录。每次将待插入记录的关键字与mid位置记录的关键字进行比较,从而确定待插入记录的插入位置。折半插入排序算法如下: ;while(low=high)
文档评论(0)