排序算法之快速排序

排序算法之快速排序


1. 常见排序算法的时间复杂度:

  • 时间复杂度为 O(N ^ 2) 的有:选择排序、冒泡排序、插入排序
  • 时间复杂度为 O(N * log N) 的有:归并排序、快速排序
  • 时间复杂度为O(N * log N)的算法比时间复杂度为 O(N ^ 2)的算法好的多
  • 时间复杂度就相当于数组的长度N与执行时间的关系
  • 时间复杂度的表示,按算最坏的情况看,而且忽略常数时间(执行时间确定的时间)
  • 算法的时间复杂度表示相同,它的区别是常数时间不同,但要排序的数组长度很长时,常数时间的影响可以忽略不计

2. 快速排序

快速排序是最快的排序算法之一, 是一种常用的排序算法,比选择排序快得多。例如,C语言标准库中的函数qsort实现的就是快速排序。快速排序也使用递归的思想。

快速排序递归思路:

  • 如果使用快速排序对数组进行排序。对排序算法来说,最简单的数组什么样呢?就是根本不需要排序的数组(空数组或只有一个元素的数组)

  • 因此,基线条件(结束递归的条件)为数组为空或只包含一个元素。在这种情况下,只需原样返回数组——根本就不用排序

快速排序递归工作原理:

  1. 首先,从数组中选择一个元素,这个元素被称为基准值
  2. 找出比基准值小的元素以及比基准值大的元素
  3. 上述两步得到了:
    • 一个由所有小于基准值的数字组成的子数组
    • 基准值
    • 一个由所有大于基准值的数组组成的子数组

这里只是进行了分区,得到的两个子数组是无序的。

那么如何对子数组进行排序呢?只要对这两个子数组再进行快速排序,不断递归下去,直到触发基线条件,结束递归,结果再往上整合,最终完成排序

下面是快速排序的代码实现(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、付费专栏及课程。

余额充值