王争老师讲过,学习算法不是死记硬背一些源代码或概念,而是学习算法的实现思路、思维、应用场景,从而达到灵活运用。
比如现在要时间复杂度为 O(n),在一个长度为 n 的数组中查找到第 K 大的元素,你会怎么做呢? 你可能会说这很简单啊,第一次遍历数组找到第 1 大元素,第二次遍历找到第 2 大,...,第 K 次就可以找到第 K 大 但是这样的时间复杂度就不是 O(n),而是 K*O(n),当 K 接近 n 时,时间复杂度就是 O(n^2)。 如果你运用快速排序算法的思想,你就可以在 O(n) 的时间复杂度内找到第 K 大元素。
快速排序算法
快速排序算法和归并排序算法一样,都是利用分治算法。但是它们却有本质的不同,归并排序是自下而上,先求解下面的子问题求,然后再逐层归并,最后全部有序;而快速排序是自上而下,下面的子问题解决后,数据就全部有序。
快速排序的思路是这样的,在数组中随机选取一个数据,例如选取最后一个元素 m 做为分区元素,比 m 小的放 m 的左边,反之放右边,再分别对左右边的分区再分别进行分区,直到分区元素缩小到 1 个,此时数据已经全部有序。
下面是我根据理解编写的快速排序代码(python语言)
#encoding=utf-8
import random
def quick_sort(data_list):
length = len(data_list)
quick_sort_c(data_list,0,length-1)
def quick_sort_c(data_list,begin,end):<