快速排序比选择排序常见的多,快速排序采用分而治之的思想。
首先,我们找出快速排序算法的基线条件。对排序算法来说,最简单的数组是空数组或者只包含一个元素的数组。 对最简单的数组来说,是不需要排序的,原样返回数组。
其次,我们需要找出递归条件,不断地将问题的规模缩小。直接凭直觉找出递归条件是比较困难的,对于初学者这来说,可以先考虑包含两个、三个、四个元素的数组如何递归排序,有特殊到一般,提炼出一些有用的规律。快速排序的基本原理是: 首先,从数组中选出一个元素作为基准值;以基准值为标准对数组进行分区,分为比基准值大的元素和比基准值小的元素,分别对两个分区执行快速排序算法;最后将数组的三个部分进行整合。
快速排序算法的步骤:
- 选择基准值
- 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
- 对这两个子数组进行快速排序
快速排序的代码实现见下,由于快速排序很简单,就不再赘述代码实现的过程,纯属小白自己练练手,自己动手能力太差了,继续努力努力再努力。
```python
#快速排序算法代码实现
#2018-12-4
#王小灿
def quicksort(arr):
"""输入一个数组,对数组进行快速排序,输出一个有序的数组"""
sortedarr = []
if len(arr) <= 1 :
return arr
else :
smaller = []
larger = []
for i in range(1,len(arr)) :
if arr[i] < arr[0] :
smaller.append(arr[i])
else :
larger.append(arr[i])
sortedarr.append(quicksort(smaller))
sortedarr.append(arr[0])
sortedarr.append(quicksort(larger))
return sortedarr
arr = [3,1,8,2,0,3,56,12,88,3,4,9]
print(str(quicksort(arr)))
经过测试,上面的代码可以实现快速排序算法,但是观察最后的输出结果发现最后的结果是数组嵌套数组,最后的结果非常不整洁。
博主想到找一找可以将数组的方括号去掉的办法。
第一,在输出的时候在显示端对格式进行修改,尝试了之后发现,因为列表时层层嵌套的,最后的输出要想去括号也需要一层一层的去掉。
第二,修改算法将三个分区进行重组的部分。我们利用列表的加减运算将列表进行连接。
```python
#快速排序算法代码实现
#2018-12-4
#王小灿
def quicksort(arr):
"""输入一个数组,对数组进行快速排序,输出一个有序的数组"""
sortedarr = []
if len(arr) <= 1 :
return arr
else :
smaller = []
larger = []
for i in range(1,len(arr)) :
if arr[i] < arr[0] :
smaller.append(arr[i])
else :
larger.append(arr[i])
#sortedarr.append(quicksort(smaller))
#sortedarr.append(arr[0])
#sortedarr.append(quicksort(larger))
return quicksort(smaller) + [arr[0]] + quicksort(larger)
arr = [3,1,8,2,0,3,56,12,88,3,4,9]
sortedarr = quicksort(arr)
print(str(sortedarr))
中间出现了好多小bug,比如报表的连接需要将中间的元素转换为列表才可以连接。
书中提供了一个更加简洁的代码,作为一个小白,还难以达到优雅代码的高度。下面的书上的代码仅供大家学习。
```python
def quicksort(array):
if len(array) < 2:
return array
else:
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(greater)
关于快速排序的时间复杂度将会在下一篇文章中进行分析,我们能够看出快速排序的速度和基准值的选择相关,如果基准值选择的是中间的元素,那么时间复杂度就低。