第9章内排序.docVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章内排序.doc

第9章 内排序 排序是数据处理过程中经常使用的一种重要运算,本章主要讨论内排序的各种算法。并对各个算法的时间和空间复杂性以及算法的稳定性等进行讨论。 重点:直接插入排序、shell排序、直接选择排序、堆排序、冒泡排序、快速排序、归并排序等。 难点:堆排序、快速排序算法的理解。 本次课主要讲解:排序的基本概念;插入排序算法;选择排序算法。 9.1 排序的基本概念 1.什么是排序(Sorting)? 简单地说,排序就是将一组杂乱无章的数据按一定的规律排列起来(递增或递减)。 确切的说所谓排序就是使一组任意排列的对象变成一组按关键字线性有序的对象。 2.主、次关键字 次关键字(Key) : 作为排序依据的数据对象中的属性域。 主关键字 :不同的数据对象若关键字互不相同,则这种关键字称为主关键字。 3.内排序和外排序 内排序:指在排序过程中所有数据均放在内存中处理,不需要使用外存的排序方法。 外排序:对于数据量很大的文件,在内存不足的情况下,则还需要使用外存,这种排序方法称为外排序。 4.算法的稳定性 排序码相同的记录,若经过排序后,这些记录仍保持原来的相对次序不变,称这个排序算法是稳定的。否则,称为不稳定的排序算法。 5.评价排序算法优劣的标准 首先考虑算法执行所需的时间(时间复杂度),它是衡量算法好坏的最重要的标志。通常用算法执行中的数据比较次数和数据移动次数来衡量。 其次考虑算法执行所需要的附加空间(空间复杂性)。 当然,保证算法的正确性是不言而喻的,可读性等也是要考虑的因素。 6.抽象数据类型 为简单起见,数据的存储结构采用记录数组形式,同时假定关键字是整数。记录数组的类型说明如下: #define MAXSIZE 100 typedef struct{ keytype key; }datatype; /*记录类型的定义*/ datatype a[MAXSIZE]; 9.2 插入排序 基本原理,每步将一个待排序的对象,按其关键字大小,插入到前面已经排好序的一组对象适当位置上,直到对象全部插入为止。 直接插入排序(Insert Sort) 希尔排序(Shell Sort) 9.2.1直接选择排序 1.算法思想 初始可认为文件中的第0个记录己排好序,然后将第1个到第n个记录依次插入已排序的记录组成的文件中。在对第i个记录Ri进行插入时,R0,R1,…,Ri-1已排序,将记录Ri的排序码keyi与已经排好序的排序码从右向左依次比较,找到Ri应插入的位置,将该位置以后直到Ri-1各记录顺序后移,空出该位置让Ri插入。 分析:一组记录的排序码分别为: 312,126,272,226,28,165,123 初始时将第1个排序码作为已经排好序的,把排好序的数据记录放入中括号[]中,表示有序的文件,剩下的在中括号外,如下所示: [312],126,272,226,28,165,123 设前3个记录的排序码已重新排列有序,构成一个含有3个记录的有序文件: [126,272,312],226,28,165,123 现在要将第4个排序码226插入 ! 将待插入的排序码226和已经有序的最后一个排序码312比较,因为待插入的排序码226小于312,所以226肯定要置于312的前面,至于是否就是置于312的前一个位置,此时还不能确定,需要继续向左比较; 将所有大于待插入排序码226的那两个排序码312和272依次后移一个位置,在空出的位置插入待排序的排序码226,得一含有4个记录的有序文件: [126,226,272,312],28,165,123 需要注意的是,当待插入排序码小于所有已排序的排序码时,如在插入第5个值28时: [126,226,272,312],28,165,123 2.算法设计的时候如何处理? a.方法之一:判断指针是否小于零 void InsertSort(datatype a[],int n) { int i,j; datatype temp; for (i=0;in-1;i++) { temp=a[i+1]; j=i; while (j-1temp.keya[j].key) a[j+1]=a[j- -]; a[j+1]=temp; } } 问:temp作用是什么? b.方法之二:设置“哨兵” void insertsort(datatype a[], int n) { int i,j; for(i=2;i=n;i++)/*依次插入从第2个开始的所有元素*/ { j=i-1; a[0] =a[i];/*设置哨兵,准备找插入位置*/ while(a[0].k

文档评论(0)

dzzj200808 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档