- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
014分而治之1
山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 4 2 3 1 7 5 6 8 ↑ ↑ i j 4 2 3 1 7 5 6 8 ↑↑ ij 4 2 3 1 7 5 6 8 ↑ ↑ j i 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 1 2 3 4 7 5 6 8 ↑ ↑ j i 【1 2 3】 4 【7 5 6 8】 * * 空间复杂性:递归栈空间: O(n). 时间复杂性 最坏情况: 支点元素是数组中的最小元素或最大元素,left总是为空(或right总是为空) 时间:Q(n2) 最好情况: left和right中的元素数目大致相同。 时间: O(nlogn) 快速排序的平均复杂性也是Q(nlogn). 快速排序复杂度分析 * * 稳定排序? 快速排序 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 定理14-1:快速排序的平均复杂性为Q(nlogn)。 证明:P449 设S为左端所含元素的个数,s有同等机会取0~n-1中的任何一个值。 归纳法可证明:t(n) ≤knlogn 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 各种排序算法的比较 方法 最坏复杂性 平均复杂性 冒泡排序 n2 n2 基数排序 n n 插入排序 n2 n2 选择排序 n2 n2 堆排序 nlogn nlogn 归并排序 nlogn nlogn 快速排序 n2 nlogn * * 各排序算法平均时间的曲线图 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 中值快速排序 中值快速排序( median-of-three quick sort)是程序14-6的一种变化,这种算法有更好的平均性能。 不必使用a [1]做为支点,而是取{a[1],a[(1+r)/2],a[r]} 中大小居中的那个元素作为支点。 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 14.2.4 选择(Selection) 对于给定的n个元素的数组a[0:n-1],要求从中找出第k小的元素。当a[0:n-1]被排序时,该元素就是a[k-1]。 方法1. 对这n个元素进行排序(如使用堆排序式或归并排序), 取出a[k-1]中的元素 时间:O(nlogn) 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 14.2.4 选择 2.使用快速排序: a[l] a[l+1] …… a[ ] …… a[r] j j-l+1 j-l+1=k: j-l+1k: 左面部分第k小的元素 j-l+1k: 右面部分第(k-(j-l+1)=k-j+l-1)小的元素 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * 程序14-7 寻找第k个元素 templateclass T T Select(T a[], int n, int k) {//返回a[0:n-1]中第k小的元素 // 假定a[n] 是一个伪最大元素 if (k 1 || k n) throw OutOfBounds(); return select(a, 0, n-1, k); } templateclass T T select(T a[], int l, int r, int k) {// 在a[l:r]中选择第k小的元素 if (l=r) return a[l]; int i=l, // 从左至右的游标 j = r+1; // 从右到左的游标 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法 * T pivot = a[l]; // 把左侧= pivot的元素与右侧= pivot 的元素进行交换 while (true) { do {// 在左侧寻找= pivot 的元素 i=i+1; } while (a[i] pivot); do {// 在右侧寻找= pivot 的元素 j=j-1; } while (a[j]pivot); if (i=j) break; // 未发现交换对象 Swap(a[i], a[j]); } if (j-l+1= =k) return pivot; 山东大学计算机科学与技术学院 数据结构 第14章 分而治之算法
文档评论(0)