快速排序 |
您所在的位置:网站首页 › 快速排序算法的优点 › 快速排序 |
说明:这篇文章正如标题所说,主要看分析 如果嫌弃文章太长,可以直接通过最后面的小结来选看 快速排序 算法思想 快速排序可能是现实应用中最多的一种,但是没有一种排序算法能适应所有的情况,在最糟糕的情况下,快速排序性能就比较差了。但是对于大多数情况下,对于大量的随机数据的排序,快速排序算法的效率还是非常高的。(前提是将快速排序算法实现的小细节实现到位,快速排序的特点是自己编写是容易写错) 它的基本思想是:假设待排序的序列L[1....n],首先选取一个主元pivot,然后将待排序的元素分割成两部分,左边的部分L[1,k-1]小于pivot,右边的部分L[k + 1]大于pivot(其实这是一个很重要的问题:是严格小于还是小于等于,是严格大于还是大于等于)考虑如何具体的实现,后面会说明怎样考虑)。pivot就是放在最终正确的位置k上,这就是一趟排序的过程。然后递归的对两个子序列重复上述的过程,直到只有一个元素或者为空(这两种情况都是有可能发生的,例如考虑{1,2,3,4,5}选取元素3之后,划分为两个子集{1,2},{4,5}继续选取主元2之后划分成{1}和空集,选取主元4之后,划分成{5}和空集) 如图所示:![]() ![]() Q:主元怎么选?元素怎么分? 首先考虑一下什么是快速排序算法的最好情况? 每次主元正好取到中间,会将元素一分为二。 关于时间复杂度的分析?分析博文 简单说一下就是: 最好的情况下:主元的选取正好能够将划分成左右子集个数相等。 //时间复杂度分析 T(n)≤2T(n/2) +O(n),T(1)=0 T(n)≤2(2T(n/4)+n/2) +n=4T(n/4)+O(2n) T(n)≤4(2T(n/8)+n/4) +2n=8T(n/8)+O(3n) …… T(n)≤nT(1)+O((log2n)×n)= O(nlogn)最差的情况是:主元的选取将子集划分成空集和个数为N-1的子集 //时间复杂度分析 T(n) = O(n) + T(n-1) //其中的O(n)指的是,主元选取之后遍历元素来划分子集。 = O(n) + O(n-1) + T(n-2) = O(n) + O(n-1) + ... +O(1) = O(n^2)然后考虑主元的选择和子集的划分 主元选择: 这里只说明了三种情况(你也可以自己通过其他的方法选取主元,尽量能够将子集等分为主,时间复杂度低) 1.选取A[0] 2.随机选取 3.选取3点的中位数第一种情况,选取最左边的元素。 考虑:数组是完全有序的(好像数据结构书中就是取最左端的元素) ![]() ![]() i右移,找到错误位置的元素, j左移,找到错误位置的元素, 元素交换 …
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |