第十章_内部排序.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章_内部排序,内部排序算法比较,内部排序,内部排序外部排序,内部排序算法,groupby内部排序,内部排序和外部排序,javalist内部排序,数据结构内部排序,内部排序算法定义

第十章 内部排序 2. 2-路插入排序 2-路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动纪录的次数,但为此需要n个记录的辅助空间。具体做法是:另设一个和L.r同类型的数组d,首先将L.r[1]赋值给d[1],并将d[1]看成是在排好序的序列中处于中间位置的纪录,然后从L.r中第2个记录起依次插入到d[1]之前或之后的有序序列中。先将待插记录的关键字和d[1]的关键字进行比较,若L.r[i].keyd[1].key,则将L.r[i]插入到d[1]之前的有序表中。反之,则将L.r[i]插入到d[1]之后的有序表中。在实现算法时,可将d看成是一个循环向量,并设两个指针first和final分别指示排序过程中得到的有序序列中的第一个记录和最后一个记录在d中的位置。 在2-路插入排序中,移动记录的次数约为n*n/8。 因此2-路插入排序只能减少移动记录的次数,而不能绝对避免移动纪录。并且,当L.r[1]是待排序记录中关键字最小或最大的纪录时,2-路插入排序就完全失去它的优越性。因此,若希望在排序过程中不移动纪录,只有改变存储结构,进行表插入排序。 10.4.2 树形选择排序 树形选择排序(Tree Selection Sort),又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两辆比较,然后在其中[n/2]个较小者之间再进行两两比较,如此重复,直至选出最小关键字的纪录为止。这个过程可用一棵有n各叶子结点的完全二叉树表示。 这种排序方法尚有辅助存储空间较多、和“最大值”进行多余的比较等缺点。为了弥补,提出了另一种形式的选择排序—堆排序。 在描述算法之前,尚需定义新的数据类型 #define MAX_NUM_OF_KEY 8 //关键字项数的最大值 #define RADIX 10 //关键字基数,此时是十进制整数的基数 #define MAX_SPACE 10000 typedef struct { KeysType keys[MAX_NUM_OF_KEY];//关键字 InfoType otheritems; //其他数据项 int next; }SLCell; //静态链表的结点类型 typedef struct { SLCell r[MAX_SPACE]; //静态链表的可利用空间,r[0]为头结点 int keynum; //记录的当前关键字个数 int recnum; //静态链表的当前长度 }SLList; //静态链表类型 typedef int ArrType[RADIX];//指针数组类型 void Distribute (SLCell r, int i, ArrType f, ArrType e ) { //静态链表L的r域中记录已按(keys[0],…,keys[i-1])有序。本算法按第i个关键字keys[i]建立RADIX个子表,使同一子表中记录的keys[i]相同.f[0..RADIX-1]和e[0..RADIX-1]分别指向各子表中第一个和最后一个记录。 for (j=0; jRadix; ++j) f[j] = 0; //各子表初始化为空表 for (p=r[0].next; p; p=r[p].next) { j = ord(r[p].keys[i]); //ord将记录中第i个关键字映射到[0..RADIX-1], if ( !f[j] ) f[j] = p; else r[e[j]].next = p; e[j] = p; //将p所指的结点插入第j个子表 } }// Distribute void Collect (SLCell r, int i, ArrType f, ArrType e ) { //本算法按keys[i]自小至大的将f[0..RADIX-1]所指各子表依次链接成一个链表,e[0..RADIX-1]为各子表的尾指针。 for (j=0; !f[j]; j=succ(j));

文档评论(0)

ajgoaw + 关注
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档