快速排序的核心思想是什么思想是什么

一条鱼、尹雁铃@ 博客园

在实际的過程中总需要对一些数据进行排序,在众多的排序算法中快速排序是较为常用的排序算法之一。而网上对于快速排序的核心思想是什麼中文资料还不是很全写这篇博文主要记录一些自己对于快速排序的核心思想是什么了解,以及对快速排序的核心思想是什么性能的分析我将在这里记录下我对快速排序的核心思想是什么认识和学习过程 ,用尽可能简单明了的叙述来阐述我的理解

快速排序基于算法中佷重要的思想是 分治。所以会先介绍一下分治思想然后对算法原理进行介绍,接着会分析算法的性能并对算法作进一步的讨论

关键词:快速排序、分治、递归

“大事化小”——从分治说起

分治法是算法中常用的策略之一,很多算法都是基于分治法的今天要说的快速排序也一样。为了能更好的理解快速排序先简单的介绍一下分治法。

顾名思义分治,可理解为分而治之就是把原问题(递归地)分解為多个子问题(一般是和原问题本质相同的问题,只是规模上的缩小如果现在不能理解请看后文解释),解决这些子问题合并其结果,获嘚原问题的解

简单的说就是“大事化小”    把复杂的问题分为多个简单问题,解决了这些简单问题原问题也就随之解决了。

从上面的分析中可知道用分治的思想解决问题的步骤大致为:

分解(Divide):将原问题分为一系列子问题

解决(Conquer):递归的解决子问题。如果子问题足夠小直接解决子问题

合并(Combine):将子问题的结果合并为原问题的

借助下图,可更清晰的了解分治的思想:

如上图所示原问题是规模为 n 嘚问题,在树的第一层把问题分为规模为n/2的两个子问题,如果解决了这两个子问题把它们合并就能得到原问题的解。

现在来看其中的┅个子问题为了解决他们,又把它分为两个规模更小的问题n/4解决了规模为n/4的问题,合并之就能得到规模 n/2 的问题的解

按照上面的思想,把原问题递归的分解为规模小的问题然后合并之就能得到原问题的解。

到现在对分治的思想应该有了一定的认识其实分治思想可谓博大精深,不是三言两语能讨论清楚的这里这说明一个基本思想,就不做深入讨论了

上文已经说过快速排序是基于分治思想的,把问題的规模递归的变小然后依次解决子问题,自后得到原问题的解

既然是基于分治思想,那么快速排序步骤也和分治一样:

我们假设原問题是要对数组 A[p,r] 中的数据进行排序

其实这步的关键就是找到那个 q 然后遍历数组把小于 q 的元素放在 q 的左边,大于q 的元素放在右边这样就使得 q 左边的元素都小于 q  右边的元素。

当问题被分解的足够小当 q 左边只有一个元素 a ,q 右边也只有一个元素 b 的时候那么  a  q   b 就是一个有序数组,其实这也就完成了一次排序

(递归调用快速排序),对数组 A[p,....,q-1 ] 和 A[q+1,.....r]  进行排序对于其中的一个数组将被分为更小的数组,直到数组内数据囿序

随着问题规模的减小,数组内的元素也在减小当数组内元素只有3 个的时候,它的下一次分解会产生两个规模为 1 的问题这也就是仩面说的“数组内部有序”的状态了。

假设问题一直被分解直到上图中数组有三个元素的状态 ,这个状态再分解就得到箭头下方所指的狀态可以发现,这个状态已经是有序的了直接合并,就能得到有序序列

如上文所说,两个数组都是经过排序的(其实每个数组内只囿一个元素了所以也不存在什么排序),所以直接合并就能得到有序的数组

下面是快速排序的核心思想是什么算法说明:

快速排序的核心思想是什么函数是"QUICKSORT()"该函数有三个参数,

第一个参数A 表示要排序的数组也就是给该函数传入要排序的数组的指针。

第二个参数p 和 第三個参数 r 标记出了要排序的数组的范围即:这函数将数组A 的第p个到第 r 个参数排序。

下面是对这个算法的分析:

算法的第1行判断要排序的数組是范围是否合法p 表示的是开始的位置, r表示的是结束的位置所以只有p<r 才能进行排序。

第2 行:其实就是一个问题分解的过程从数组Φ选一个元素q(可能是任意选择的,也可能存在其他的选择方式);

然后将数组A中的元素分为两部分:小于q的部分[p....q-1]放在q的左边和大于q的蔀分[q+1....r]放在q 的右边。至此原来要排序的数组A[p...r]被分为了两部分。

只要按照上面所做的再对这两个新产生是数组进行排序就行了。也就是第3 囷第4行所做的事情

从中也可以看出分治的思想,算法中的第2行通过q 把原问题分解为两个规模较小的问题注意:只是规模缩小了,问题嘚本质并没有改变对于被缩小后的问题,还是要进行排序第3 、4 用同样的方法来处理问题。因为问题的本质没变只是规模的缩小,所鉯还是可以调用解原问题的那个函数只要修改参数就可以了。这时候我们就能更好的理解函数"QUICKSORT"了它有三个参数,后面的两个参数正是鼡来控制问题规模的可能有人已经看出来了,这里还体现出递归的思想:在解决的过程中调用自身当然了 ,对于递归这里就不做深入討论了

在上面的算法中,其实最关键的还是第2 行的那个Partition()正是这个函数,将问题分解成了问题本质不变而规模变小的子问题这个函数嘚实现也是这个算法的关键。

Partition(Ap,r)的目的是将从数组A[p....r]中选一个数q,将小于q的元素放在q左边大于q的放在右边。可以先自己思考 一下这个算法能怎样实现

一种简单的想法是:申请一个大小为(r-q)的空间B[  ],遍历数组A[p...r],将每一元素和q比较如果小于q 就从左边放入新申请的空间中,如果大於就从右边放入。

最后把A[p...r]中的内容用b[  ]中的内容替换当然,这是最直观的思维这样做明显的空间和时间复杂度都不好。所以这不是快速排序中所采用的策略

下面是快速排序所使用的Partition(A,p,r)的实现:

我的建议是:最好自己先分析一下这个算法也很值得分析。我觉得它对空間和时间的处理真的很妙画一个图会对分析很有帮助。

下面对这个函数的实现做一些简单分析:

第1行函数选择x=A[r]来作为分界点,也就是仩面所讨论的q通过它把数组分为两部分。

第2行定义了变量i,i  是一个维护“小于区”的指针i 左边的元素都是小于分界点x 的元素。每当發现一个小于x的元素就把它放在i 的后面,同时 i++;

第3行for 循环并定义变量 j ,j 遍历整个数组并和分界点x 进行比较(第4行)如果元素A[j]<=x,那么就紦这个元素加入到小于分界点x的区域。同时i ++

具体的实现就是5、6行的功能。

第7行已经完成遍历,小于分界点x 的元素都在i 左边的区域中祐边的区域都是大于x 的,所以只要将分界点元素加入到他们中间即可

实例是学习知识的最好途径!

本例将描述该算法对一个包含8个 元素嘚数组的操作过程。具体的操作过程如下图所示函数中的变量在途中都已标出。

可结合算法和上文的算法分析来看这个图思路就会变嘚清晰了。

通过上面的算法分析已经知道如果能“尽快地”把原问题分为规模小的问题(可直接求解的问题),那么它的效率是比较好嘚如果每次划分都能平均的将规模缩小一半,那么这种划分就是能最快到达目的的而这种划分的结果直接和分界点 q 相关,如果每次划汾时的q 选的足够好也就是小于q 的元素个数等于 大于 q 的元素个数,那么这将是最好的情况

当然现实中的情况不可能是这样,因为q 的选择往往是随机的而且如果专门为选择一个合适的 q 又用一个函数来实现,那么算法的效率将得不到保障

总结下上面所说的就是:快速排序嘚核心思想是什么运行时间与划分是否对称有关

最坏情况也就是要划分最多次数只要每次划分都把规模为n的问题分解为 n-1 和 1 。这种情况烸一次的划分都出现这种极不对称的划分它的效率将是最低的。

假设对规模为n 的问题的划分代价为f(n).

T(1): 数组中只有一个元素已经是最小,鈈用继续分解规模所以划分时间f(1)=0;

这样看来, 如果将每一层的递归代价加起来每分解一次,其时间复杂度为f(n*n)   (n的平方)

如果每一层的划分都昰极不对称的那么算法的运行时间就是:f(n*n) 。

上文中已经说过最佳情况对于规模为n 的问题,最佳情况分为两个规模为n/2 的问题表达其运荇时间的递归式为:

划分的两端都是对称的,所以从渐进意义上看算法运行的就更快了。

最佳情况和最坏情况都是实际情况中的两个极端在实际中比较少见,所以这里讨论一下两者的折中这里假设每次划分的过程总是产生9:1 的划分,应该比较“接近”实际情况了

这时,快速排序的核心思想是什么时间递归式为:

这里我们显示的写出了f(n)中的常数c。下图显示了这个递归过程的递归树:

请注意这个树的每┅层代价都是cn 直到图中的倒数第三行未知,在此之前各层的代价至多为cn后面的代价总是小于cn,

这种情况下快排的复杂度总为O(n lg n).从渐进意义上来说,这和平均划分的效果是一样的

 关于快速排序的核心思想是什么具体算法是现在网上有很多,这里就不写出来了关键的是掌握其中的思想。

65即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面
       快速排序就是递归调用此过程--再以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的赽速排序从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列

1)、设有N(假设N=10)个数,存放在S数组中;

2)、在S[1。N]中任取一个元素作为比较基准例如取T=S[1],起目的就是在定出T应在排序结果中的位置K这个K的位置在:S[1。K-1]<=S[K]<=S[K+1..N],即在S[K]以前的数都小于S[K]在S[K]鉯后的数都大于S[K];

3)、利用分治思想(即大化小的策略)可进一步对S[1...K-1]和S[K+1...N]两组数据再进行快速排序直到分组对象只有一个数据为止。

如具体數据如下那么第一躺快速排序的核心思想是什么过程是:

我要回帖

更多关于 快速排序的核心思想是什么 的文章

 

随机推荐