分而治之和快速排序

Posted 机器学习与深度学习G

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分而治之和快速排序相关的知识,希望对你有一定的参考价值。


一、分而治之

一种著名的递归式问题解决方法------分而治之(D&C)分而治之方法与软件设计的模块化方法非常相似。为了解决一个大的问题,可以:

1) 把它分成两个或多个更小的问题;

2) 分别解决每个小问题;

3) 把各小问题的解答组合起来,即可得到原问题的解答。小问题通常与原问题相似,可以递归地使用分而治之策略来解决。

下面是关于分而治之的一个例子:

假设你是一个农场主有一小块土地:

你要将这块地均匀地分成方块,且分出的方块要尽可能大。显然,下面的方法都不符合要求。

分而治之和快速排序

如何将一块地均匀的分为方块,并确保分出的方块是最大的呢?使用分而治之策略!分而治之算法是递归的。使用分而治之解决问题的过程包括两个步骤:

1>找出基线条件,这种条件必须尽可能简单。

2>不断将问题分解(或者说缩小规模),直到符合基线条件。

下面将使用分而治之找出前述问题的解决方案。可你能使用的最大方块有多大?

首先,找出基线条件。最容易处理的情况是,一条边的长度是另一条边的整数倍。如果是两倍,则可以一分为二,如果是三倍,则可以一分为三。

分而治之和快速排序

现在需要找出递归条件,这正是分而治之的用武之地,每次递归调用都必须缩小问题的规模。如何缩小规模呢?我们可以首先找出这块地可容纳的最大方块。

分而治之和快速排序

你可以从这块地中划出两个640m*640m的方块,同时余下一小块地。

你可以想象,如果将剩下的那一小块地采用相同的算法,那将会得到第三块大的地,尺寸是400m*400m。

这样看来,最开始要划分的地是1680m*640m,通过划分出两个640m*640m的方块,余下640m*400m的方块,这样需要划分的土地变得更小。适用于这一小块地的最大方块,也是适用于整块地的最大方块。这样来看,这个划分土地的问题,被简化为划分更小的土地的问题。

二、快速排序

2.1 快速排序原理

第一个重要的D&C算法------快速排序,快速排序是一种排序算法。速度比选择排序快得多。使用快速排序对数组进行排序,对排序算法来说,最简单的数组是什么样子的呢?就是根本不需要排序的数组

例如:空数组和只包含一个元素的数组。

所以基线条件为数组为空数组或者数组只包含一个元素,在这种情况下,只需要原样返回数组,根本不需要排序。

若数组为更长的数组,例如包含两个元素的数组:

若数组中包含三个元素,则我们可以使用分而治之策略,先将数组进行分解,直到满足基线条件。下面介绍快速排序的原理。

1>从数组中选择一个元素作为基准值pivot(一般是数组的第一个元素,但是其实数组中的任何元素都可以作为基准值)。

2>找出比基准值小的元素和比基准值大的元素,这称之为分区 。现在有了三个区域:一个由所有小于基准值的数字组成的子数组;基准值;一个由所有大于基准值的数组组成的子数组。

3>分区之后得到的两个子数组是无序的,但是如果这两个子数组有序,将会使得整个排序变得非常容易,直接合并三个区域:左边的数组+基准值+右边的数组

4>而两个子数组处于无序状态,则需要对两个子数组采取排序,只需要对两个子数组进行快速排序,在进行合并,就能得到一个有序数组。

2.2 快速排序代码实现

# 快速排序:平均时间复杂度是O(nlog n)
def quicksort(array):
arraylength = len(array)
# print(arraylength)
if arraylength < 2:
return array # 只包含一个元素,不用排序
else:
pivot = array[0] # 找基准值
# print(pivot)
less = []
greater = []
for i in array[1:]:
if pivot >= i:
less.append(i) # 将比pivot小的元素添加到less
# print(less)
else:
greater.append(i)
return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([10 ,2, 3, 5]))

三、小结

1、分而治之算法将问题逐步分解,直至找出基线条件,在处理数组时,基线条件可能是一个空数组或者只包含一个元素的数组。

2、实现快速排序时,最主要的是随机的选取基准值,在写代码的过程中,一般选用第一个元素作为基准值,快速排序的平均运行时间是O(logn)。

以上是关于分而治之和快速排序的主要内容,如果未能解决你的问题,请参考以下文章

Day4-快速排序和反转整数

归并排序和快速排序

分而治之和快速排序

快速排序学习

算法图解之快速排序

快速排序