上期文章排序算法——(2)Python实现十大经常使用排序算法为你们介绍了十大经常使用排序算法的前五种(冒泡、选择、插入、希尔、归并),由于快速排序的重要性,因此今天将单独为你们介绍一下快速排序!html
排序算法(Sorting algorithm)是计算机科学最古老、最基本的课题之一。要想成为合格的程序员,就必须理解和掌握各类排序算法。其中"快速排序"(Quicksort)使用得最普遍,速度也较快。它是图灵奖得主C. A. R. Hoare(托尼·霍尔)于1960时提出来的。python
快排的实现方式多种多样,猪哥给你们写一种容易理解的:分治+迭代,只须要三步:程序员
举个例子,假设我如今有一个数列须要使用快排来排序:{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48},咱们来看看使用快排的详细步骤:面试
26
做为基准值(基准值能够随便选)3
开始和基准值26
进行比较,小于基准值,那么将它放入左边的分区中,第二个元素44
比基准值26
大,把它放入右边的分区中,依次类推就获得下图中的第二列。quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
是否是很简洁很秀,若是再有面试官让你手写一个快排,你就把这行写上去吧,面试官见了都要喊你秀儿,哈哈。算法
在你感叹python吊炸天的同时,你因该考虑到代码的可读性问题,lambda
函数设计是为了代码的简洁性,可是滥用的话会致使可读性变得极差,并且如今pep8代码规范中也不建议使用lambda
函数了,建议使用关键字def
去定义一个函数,因此下面猪哥给你们写一段符合pythonic
风格的快排代码数组
def quick_sort(arr): """快速排序""" if len(arr) < 2: return arr # 选取基准,随便选哪一个均可以,选中间的便于理解 mid = arr[len(arr) // 2] # 定义基准值左右两个数列 left, right = [], [] # 从原始数组中移除基准值 arr.remove(mid) for item in arr: # 大于基准值放右边 if item >= mid: right.append(item) else: # 小于基准值放左边 left.append(item) # 使用迭代进行比较 return quick_sort(left) + [mid] + quick_sort(right)
快速排序有一个缺点就是对于小规模的数据集性能不是很好。可能有人认为能够忽略这个缺点不计,由于大多数排序都只要考虑大规模的适应性就好了。可是快速排序算法使用了分治技术,最终来讲大的数据集都要分为小的数据集来进行处理,因此快排分解到最后几层性能不是很好,因此咱们就可使用扬长避短的策略去优化快排:app
这一改进被证实比持续使用快速排序算法要有效的多。函数
quick_sort = lambda array: array if len(array) <= 1 else quick_sort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item > array[0]])
快排是面试与考试中最高频的一种排序算法(没有之一),请你们务必理解与掌握,欢迎你们在评论区留言,同时也但愿你们转发分享让更多的人爱上python这门语言。性能