内容简介:快速排序通常是实际排序应用中最好的选择。它在最坏情况下的时间复杂度很差,但是平均性能非常好。另外,它能够进行原址排序。与归并排序一样,快速排序也用到了分治思想。其主过程的代码如下:算法的关键是数组划分过程PARTITION,它实现了对子数组$A[p…r]$的原址重排。选择$x=A[r]$作为主元,围绕它来划分数组$A[p…r]$。完成划分后,$A[p…q-1]$的每一个元素都小于等于$A[q]$,而$A[q]$也小于等于$A[q+1…r]$中的每个元素。程序最后返回主元的新小标。代码如下:
快速排序通常是实际 排序 应用中最好的选择。它在最坏情况下的时间复杂度很差,但是平均性能非常好。另外,它能够进行原址排序。
快速排序的描述
与归并排序一样,快速排序也用到了分治思想。其主过程的代码如下:
void quicksort(int A[], int p, int r) { if (p < r) { int q = partition(A, p, r); quicksort(A, p, q-1); quicksort(A, q+1, r); } }
算法的关键是数组划分过程PARTITION,它实现了对子数组$A[p…r]$的原址重排。选择$x=A[r]$作为主元,围绕它来划分数组$A[p…r]$。完成划分后,$A[p…q-1]$的每一个元素都小于等于$A[q]$,而$A[q]$也小于等于$A[q+1…r]$中的每个元素。程序最后返回主元的新小标。代码如下:
void Exch(int *arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } int partition(int A[], int p, int r) { int x = A[r]; int i = p - 1; for (int j = p; j < r; j++) { if (A[j] <= x) { ++i; Exch(A, i, j); } } Exch(A, i+1, r); return (i + 1); }
PARTITION在子数组$A[p…r]$上的复杂度为$\Theta(n)$,其中$n=r-p+1$。
快速排序的性能
当划分产生的两个子问题分别包含了$n-1$个元素和$0$个元素时,快速排序的 最坏情况 就发生了。假设算法的每一次递归调用中都出现了这种不平衡划分,可以得到如下的递归式:
$$
T(n) = T(n-1) + T(0) + \Theta(n) = T(n-1) + \Theta(n)
$$
可以得到时间复杂度为$T(n) = \Theta(n^2)$,也就是说,最坏情况下,快速排序的运行时间并不比插入排序好。当输入数组已经完全有序时,快速排序的时间复杂度为$\Theta(n^2)$,而这种情况下插入排序的时间复杂度为$O(n)$。
在可能的最平衡的划分中,PARTITION得到的两个子问题的规模都不大于$n/2$,这便是快速排序的 最好情况 。运行时间的递归式为:
$$
T(n) = 2T(n/2) + \Theta(n)
$$
上述递归式的解为$T(n) = \Theta(n \lg n)$,通过在每一层递归中都平衡划分子数组,我们得到了渐近时间上更快的算法。
实际上,只要划分是常数比例的,算法的运行时间总是$O(n \lg n)$,即使是$99:1$的划分,其时间复杂度仍然是$O(n \lg n)$。当对一个随机输入的数组进行快速排序时,平均情况下,划分同时混合有“好”和“差”的划分。当好和差的划分交替出现时,快速排序的复杂度和全是好的划分时一样,仍然是$O(n \lg n)$,区别只在于隐含的常数因子要略大一些。
快速排序的随机化版本
前面的讨论基于一个前提:输入数据的所有排列都是等概率的。实际工程中并不总是这样的,所以我们可以通过在算法中引入随机性,从而使得算法对于所有的输入都能获得较好的期望性能。
可以从子数组$A[p…r]$中随机选择一个元素作为主元,这通过将$A[r]$与从$A[p…r]$中随机选出的一个元素交换来实现。由于主元元素是随机选取的,在平均情况下,对数组的划分是比较均衡的。代码略。
快速排序分析
本节用严格的数学推导计算了快速 排序算法 的运行时间。在输入元素互异的情况下,随机化版本的期望运行时间为$O(n \lg n)$。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 算法导论阅读笔记 --- 排序算法
- 算法导论学习笔记5 随机算法
- 『算法导论』第二章
- js实现多种排序算法(算法导论第二章)
- 『算法导论』第 8 章:线性时间排序
- 机器学习的算法和普通《算法导论》里的算法有什么本质上的异同?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
操作系统基础教程
戴维斯 / 第1版 (2006年7月1日) / 2006-7 / 34.0
这是一本关于操作系统基本原理的教科书,其最大特点就是从操作系统的分层概念出发,深入浅出地介绍了操作系统的基本概念和基本框架。本书可以作为高等院校非计算机专业相关课程的教材或参考书,也适合具有高中以上数学基础的计算机用户自学,还可以作为社会上计算机培训机构的教材。对所有想了解计算机操作系统,但又不需要或不打算深入学习其理论和实现细节的读者来说,本书是一本极具价值的入门指导书。一起来看看 《操作系统基础教程》 这本书的介绍吧!