[理学]数据结构10.ppt

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

数据结构 第10章 内部排序 10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序 10.5 归并排序 10.6 基数排序 10.7 各种内部排序方法的比较讨论 排序概述 排序的功能:将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列 排序的稳定性:如果在待排序的记录序列中有多个数据元素的关键字值相同,经过排序后,这些数据元素的相对次序保持不变,则称这种排序算法是稳定的,否则称之为不稳定的 如果排序算法是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用 排序的分类 内部排序和外部排序:内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,而需要将一部分数据元素放置在内存,另一部分数据元素放置在外设上 内部排序 按不同排序原则:插入、交换、选择、归并、基数 按所需工作量:简单O(n2)、先进O(nlogn)、基数O(d·n) 排序概述 排序过程中的基本操作 比较两个关键字 将记录从一个位置移到另一个位置 待排序序列的存储方式 地址连续的存储单元(类似于顺序存储) 静态链表中(排序时修改指针,不移动位置) 有地址向量的连续存储单元(修改记录地址) 插入排序 直接插入排序(简单排序) 基本操作:从数组的第二个单元开始,依次从原始数据中取出数据,并将其插入到数组中该单元之前的已排好序的序列中合适的位置处 操作步骤: 从已排好的序列尾部开始,逐一比较,找到新记录该插入的位置,完成第一次插入 第i趟就是在含有i-1个记录的有序子序列r[1..i-1]中插入记录r[i]后变成含有i个记录的有序序列 为防止数组下标出界,在r[0]处设置监视哨 整个过程进行n-1次插入 直接插入排序过程 初始:49 38 65 97 76 13 27 49 i=2: 38 49 65 97 76 13 27 49 i=3: 38 49 65 97 76 13 27 49 i=4: 38 49 65 97 76 13 27 49 i=5: 38 49 65 76 97 13 27 49 i=6: 13 38 49 65 76 97 27 49 i=7: 13 27 38 49 65 76 97 49 i=8: 13 27 38 49 49 65 76 97 void InsertSort(SeqList R){ for(i=2;i=n;i++) //依次插入R[2],...,R[n] { R[0]=R[i];//R[0]是哨兵,也是R[i]的副本 for(j=i-1; R[0].keyR[j].key; j--) R[j+1]=R[j]; /*将关键字大于R[i].key的记录后移*/ R[j+1]=R[0]; }//endfor }//InsertSort 插入排序 折半排序 简单插入的缺点:当n大时,耗时 基本操作:在一个有序表中进行查找(使用折半查找法)和插入 操作步骤: 设立两个指针:low、high 通过比较,查找和插入 插入排序 希尔排序: 优点:在时间上做了改进(分组插入法) 基本思想:将待排记录分成若干序列(定义一个增量)进行直接排序,直到序列基本有序。“基本有序”时对全体记录进行一次直接插入排序 增量的选择:增量序列应该是没有除1之外的公因子,并且最后一个增量值必须是1 不稳定排序算法 希尔排序过程 void ShellInsert(SeqList R, int dk){ for(i=dk+1;i=n;i++) if(R[i].keyR[i-dk].key){ R[0]=R[i]; //R[0] 是R[i]的副本 for(j=i-dk; j0R[0].keyR[j].key; j=j-dk) R[j+dk]=R[j]; //记录后移 R[j+dk]=R[0]; } } void ShellSort(SeqList R, int dlta[], int t){ for(k=0; kt; k++) ShellInsert(R,dlta[k]); } 交换排序 冒泡排序 基本思想:将每个记录R[i]看作是重量为R[i].key的气泡,根据轻气泡不在重气泡之下的原则,从下往上扫描数组R,逐一比较,交换顺序 适合n较小的情况 冒泡排序过程 初始值:49 38 65 97 76 13 27 49 第一趟结果:38 49 65 76 13 27 49 97 第二趟结果

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档