- 1、本文档共67页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
排序算法及算法分析 问题的提出: 为什么要排序?有序表的优点?缺点? 构造关系。 按照什么原则排序? 比较? 如何进行排序? 基本概念 排序(Sorting): 简单地说,排序就是把一组记录按照某个(或某几个)字段的值以递增(由小到大)或递减(由大到小)的次序重新排列的过程。(如按年龄从小到大排序) 排序码 与 关键码(primary key) 作为比较基础的一个(或多个)字段,称为排序码。排序码可以是数值、符号或符号串。 排序码不一定是关键码,关键码可以作为排序码。关键码是唯一的,但排序码不一定唯一。排序码不唯一时,排序的结果可能不唯一。 参与排序的对象,称为记录。一个记录可以包含多个字段。 如果记录集合中存在多个排序码相同的记录,经过排序后,排序码相同的记录的前后次序保持不变,则这种排序方法称为是稳定的,否则是不稳定的。 排序的类型 排序方法可以分为五种∶插入排序、选择排序、交换排序、分配排序和归并排序。 在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。 本章侧重讨论内排序的方法,但有些方法(特别是归并排序的思想)也可以用于外排序。 插入排序 基本思想:每步将一个待排序的记录,按其排序码大小插到前面已经排序的字序列的合适位置,直到全部插入排序完为止。 插入排序的细分类 如何插入到已排好序的序列中? 直接插入(从后向前找位置后插入) O(n2) 二分法插入(按二分法找位置后插入) O(nlog2n) 表插入排序(按链表查找位置后插入) O(n2) 直接插入排序 基本思想: 假定前面m 个元素已经排序; 取第(m+1) 个元素,插入到前面的适当位置; 一直重复,到m=n 为止。 (初始情况下,m = 1) 存储结构与算法优化 顺序存储结构: 二分插入算法,减少比较次数。 链式存储结构: 减少移动次数。 二分法插入排序 特点:在直接插入排序的基础上减少比较的次数,即在插入Ri时改用二分法比较找插入位置,便得到二分法插入排序 限制:必须采用顺序存储方式。 二分法插入排序算法 void binSort(SortObject * pvector) {int i, j, left, mid, right;RecordNode temp;for( i = 1; i pvector-n; i++ ) { temp = pvector- record[i]; left = 0; right = i – 1; while (left = right) { mid = (left+right)/2; if (temp.key vector-record[mid].key) right = mid-1; else left = mid+1; }//while for(j=i-1; j=left; j--) pvector-record[j+1] = pvector-record[j]; if(left != i) pvector-record[left] = temp; }// for } // binSort 结论 移动次数与直接插入排序相同,最坏的情况为n2/2,最好的情况为n,平均移动次数为O(n2) 二分法插入排序算法的平均时间复杂度为 T(n)= O(n2) 二分法插入排序是稳定的 归并排序(merge sort) 归并排序的基本操作是将两个或两个以上的记录有序序列归并为一个有序序列。 最简单的情况是:只含一个记录的序列显然是个有序序列,经过逐趟归并使整个序列中的有序子序列的长度逐趟增大,直至整个记录序列为有序序列止。 归并排序(merge sort) Merge Sort Merge Sort 二路归并算法的基本思路: 两组归并算法merge: 按low,m,high归并两组记录。结果放于low,high之间。 void merge(RecordNode* r, RecordNode *r1, int low, int m, int high) 一趟归并算法mergePass: 两两归并长度为length的一组记录: void mergePass(RecordNode *r, RecordNode
文档评论(0)