快速排序详解并附上python代码(8行实现)

写在前面

  • 本博客主要从快排的思想,时间复杂度分析和实现三方面来写。熟练掌握手写快速排序是面试常考点。

1. 快速排序的思想

  • 快速排序基于分而治之(D&C,divide and conquer)的思想,顾名思义,就是分开“治它”。也是一种递归思想

1.2 回归递归思想

  • 递归需要两个东西,一个是基线条件(递归出口),一个递归条件(何时调用自己)

1.3 快速排序的步骤

(1) 选择一个基准值pivot
(2)将数组分成两个数组:小于基准值的子数组和大于基准值的子数组
(3)对这两个数组进行快速排序
(4)判断当前是否为基准条件:数组的长度<2,若是连接所有数组返回,若不是,返回(2)

2. 快速排序的时间复杂度分析

  • 首先,这里分析什么原因会导致快排的时间复杂度的变化。答案是基准值的选取。一般来说,我们肯定会选取数组中的第一个元素当成基准值,当数组有序时,时间复杂度会变成O(n**2),其余情况为O(nlogn)
  • 时间复杂度由两部分组成:递归栈的深度,划分操作(判断大于小于基准值)

2.1 平均时间复杂度

  • 这里的平均时间复杂度指的是最佳时间复杂度
  • 栈的深度怎么计算:看划分了几次,我们设划分了k次,则2**k=n,n表示数组元素的个数,所以k=logn
  • 划分操作:对于每一次的划分,我们其实都操作了O(n)的复杂度,因为我们知道O(kn)=O(n),这里k=1/2,1/4…
  • 所以总的时间复杂度为O(nlogn)
    在这里插入图片描述

2.2 最坏的时间复杂度

  • 考虑数组是有序的,我们依然选取第一元素为基准值
  • 这里栈的深度为O(n),所以总的时间复杂度为O(n**2)
    在这里插入图片描述

3. python实现

def quick_sort(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 quick_sort(less) + [pivot] + quick_sort(greater) # 递归条件
		

猜你喜欢

转载自blog.csdn.net/weixin_44441131/article/details/106446763
今日推荐