《图解算法》阅读08—快速排序算法

快速排序比选择排序常见的多,快速排序采用分而治之的思想。
首先,我们找出快速排序算法的基线条件。对排序算法来说,最简单的数组是空数组或者只包含一个元素的数组。 对最简单的数组来说,是不需要排序的,原样返回数组。
其次,我们需要找出递归条件,不断地将问题的规模缩小。直接凭直觉找出递归条件是比较困难的,对于初学者这来说,可以先考虑包含两个、三个、四个元素的数组如何递归排序,有特殊到一般,提炼出一些有用的规律。快速排序的基本原理是: 首先,从数组中选出一个元素作为基准值;以基准值为标准对数组进行分区,分为比基准值大的元素和比基准值小的元素,分别对两个分区执行快速排序算法;最后将数组的三个部分进行整合。
快速排序算法的步骤:

  1. 选择基准值
  2. 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
  3. 对这两个子数组进行快速排序

快速排序的代码实现见下,由于快速排序很简单,就不再赘述代码实现的过程,纯属小白自己练练手,自己动手能力太差了,继续努力努力再努力。

```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)

关于快速排序的时间复杂度将会在下一篇文章中进行分析,我们能够看出快速排序的速度和基准值的选择相关,如果基准值选择的是中间的元素,那么时间复杂度就低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值