数据结构第0.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章 内部排序 10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序 10.5 归并排序 10.6 基数排序 10.7 各种排序方法比较 一、排序(Sorting) 排序:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。 二、排序基本操作 排序的基本操作包括: 比较:比较两个关键字的大小 移动:将记录从一个位置移动至另一个位置 一、直接插入排序 每步将一个待排序的对象, 按其关键字大小, 插入到前面已经排好序的有序表的适当位置上, 直到对象全部插入为止。 直接插入排序(算法实现) 直接插入排序(算法分析) 关键字比较次数和记录移动次数与记录关键字的初始排列有关。 最好情况下, 排序前记录已按关键字从小到大有序, 每趟只需与前面有序记录序列的最后一个记录比较1次, 移动0次记录, 总的关键字比较次数为 n-1, 记录移动次数为 0。 直接插入排序(算法分析) 在平均情况下的关键字比较次数和记录移动次数约为 n2/4。 直接插入排序的时间复杂度为O(n2)。 直接插入排序是一种稳定的排序方法 直接插入排序最大的优点是简单,在记录数较少时,是比较好的办法 二、折半插入排序 折半插入排序在查找记录插入位置时,采用折半查找算法 折半查找比顺序查找快, 所以折半插入排序在查找上性能比直接插入排序好 但需要移动的记录数目与直接插入排序相同(为O(n2)) 折半插入排序的时间复杂度为O(n2)。 折半插入排序是一种稳定的排序方法 三、希尔排序 从直接插入排序可以看出,当待排序列为正序时,时间复杂度为O(n) 若待排序列基本有序时,插入排序效率会提高 希尔排序方法是先将待排序列分成若干子序列分别进行插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序 希尔排序又称为缩小增量排序。 希尔排序(算法) 首先取一个整数 gap n(待排序记录数) 作为间隔, 将全部记录分为 gap 个子序列, 所有距离为 gap 的记录放在同一个子序列中 在每一个子序列中分别施行直接插入排序。 然后缩小间隔 gap, 例如取 gap = gap/2 重复上述的子序列划分和排序工作,直到最后取gap = 1, 将所有记录放在同一个序列中排序为止。 希尔排序(举例) 例:已知待序的一组记录的初始排列为:21, 25, 49, 25*, 16, 08 希尔排序(算法分析) 开始时 gap 的值较大, 子序列中的记录较少, 排序速度较快 随着排序进展, gap 值逐渐变小, 子序列中记录个数逐渐变多,由于前面大多数记录已基本有序, 所以排序速度仍然很快。 Gap的取法有多种。 shell 提出取 gap = ?n/2?,gap = ?gap/2?,直到gap = 1。 希尔排序(算法分析) 对特定的待排序记录序列,可以准确地估算关键字的比较次数和记录移动次数。 希尔排序所需的比较次数和移动次数约为n 1.3 当n趋于无穷时可减少到n x(log2 n)2 希尔排序的时间复杂度约为O(n x(log2 n)2) 希尔排序是一种不稳定的排序方法 一、起泡排序 设待排序记录序列中的记录个数为n。 起泡排序(举例)   void BubbleSort(SqList L)  {   // 对顺序表L作起泡排序   for (i=L.length, change=TRUE; i1 change; --i) {    change = FALSE;    for (j=1; ji; ++j)     if (L.r[j].key L.r[j+1].key)      { L.r[j]←→L.r[j+1]; change = TRUE }   }// for i  } // BubbleSort 起泡排序(性能分析) 最好情况:在记录的初始排列已经按关键字从小到大排好序时,此算法只执行一趟起泡,做n-1次关键字比较,不移动记录 二、快速排序 任取待排序记录序列中的某个记录(例如取第一个记录)作为基准(枢),按照该记录的关键字大小,将整个记录序列划分为左右两个子序列: 左侧子序列中所有记录的关键字都小于或等于基准记录的关键字;右侧子序列中所有记录的关键字都大于基准记录的关键字。 快速排序(算法) 一趟排序(某个子序列)过程 ①从high指向的记录开始,向前找到第一个关键字的值小于Pivotkey的记录,将其放到low指向的位置,low+1 ②从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,将其放到high指向的位置,high-1 重复①, ②,直到low=high,将枢轴记录放在low(high)指向的位置。 快速排序(举例) 取序列第一个记录为枢轴记

文档评论(0)

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

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

1亿VIP精品文档

相关文档