[理学]第七章排序.ppt

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

插入排序 插入排序 依次将未排记录插入到有序子表中,并使插入后仍保持有序,直到全部记录插入完毕 插入排序示例 插入排序实现 插入排序时间复杂度 O(n2) 冒泡排序 一趟排序的过程: 通过相邻两数间的比较和位置的交换,使最大的数如气泡一般逐渐往右“漂浮”直至“水面”。 整个过程: 每趟排序后都得到一个新的已排序的数,对剩下未排序的数继续下一趟排序,直到全部有序。 冒泡排序示例 全部排序过程 冒泡排序时间复杂度 O(n2) 归并排序 归并排序 分治法 把待求解问题分解为更小的问题,然后对小问题加以解决 归并排序 对假定对长度为n的数组a[0, …, n-1]排序 如果n=1,结束 如果n1,对数组a[0, …, n/2]和a[n/2 + 1, …, n-1]分别进行递归排序 对两部分已排序的数组进行合并 merge mergeSort 归并排序的时间复杂度 递归树 快速排序 分治法 分:以数组中的某一项元素x为枢轴(pivot),把数组分成两部分,前一部分的所有元素均≤x,后一部分的所有元素均≥x 治:对前后两部分数组采用同样的办法处理 一次“分”(一趟排序)的过程在O(n)时间内完成 一趟排序 一趟排序的实现 int partition(int a[], int low, int high) { // Suppose a[low] is pivot int i = low; for (int j = low + 1; j = high; j++) { if (a[low] a[j]) { i++; swap(a[i], a[j]); } } swap(a[low], a[i]); return i; } 快速排序实现 void quickSort(int a[], int low, int high) { if (low high) { int pivot = partition(a, low, high); quickSort(a, low, pivot - 1); quickSort(a, pivot + 1, high); } } 快速排序的效率分析 最坏情况 数组是完全反序或者完全正序 为什么?因为枢轴没有减少比较次数 T(n) = T(0) + T(n – 1) + O(n) = O(1) + T(n – 1) + O(n) = T(n – 1) + O(n) = O(n2) 最好情况 每次分割数组都是均匀的 T(n) = 2T(n/2) + O(n) = O(nlgn) 快速排序的效率分析 平均效率? 什么是平均? 因为算法的效率与输入有关,所以首先需要修改算法,使其与输入无关 修改partition函数的第一步: 随机选择枢轴为 low 到 high 之间的任意一项(而不是第一项),将该项与第一项互换,后面的所有操作不变 该算法的效率只与随机数产生算法有关,与输入无关 可以假定随机数的产生是均匀的,或者说:如果low – high之间有p个数,产生其中每个数的概率是1/p 指示器随机变量(indicator random variable) 快速排序平均效率的分析 关键在于:总共进行了多少次比较? 首先注意一个事实:每对元素至多比较一次 因为: 每个元素仅与枢轴元素进行比较 每次调用partition结束后,其枢轴元素已经到达合适位置,再也不会跟其他元素比较了 将数组a中的所有元素按照从小到大的顺序命名为z1,z2,…zn,其中zi为第i小的元素 定义Zij={zi, zi+1, …, zj}为zi到zj间的元素集合 算法何时会比较zi和zj ? 快速排序平均效率的分析 注意:根据partition算法,当一个满足zixzj的元素x被选为枢轴后, zi和zj会被分到不同的集合,并且以后不会再进行比较 所以, zi和zj进行比较的条件是:zi或zj在Zij中的其他所有元素之前被选为枢轴 因为Zij中j-i+1个元素,且枢轴是随机选取的,所以选中zi或zj的可能性均为1/(j-i+1) 快速排序平均效率的分析 随机快速排序算法的平均时间复杂度是O(nlogn) 快速排序是目前使用最广泛的排序方法,尽管它的最坏情况较差,但“最坏”情况出现较少,其平均速度比归并排序快一倍(我们只分析了数量级,实际上还有常数因子),且排序过程无需占用多余空间 堆排序 完全二叉树的数组存储方式 堆 一颗完全二叉树,如果满足下面的条件,则称其为堆: 任意子树的根结点的关键字总是大于(或总是小于)左、右孩子结点的关键字; 根结点总是大于子树的称为大根堆 根结点总是大于子树的称为小根堆 把完全二叉树变成堆 如何把完全二叉树变成堆? 假设二叉树的某个结点i的左右子树

文档评论(0)

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

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

1亿VIP精品文档

相关文档