–快速排序运用了分而治之的方法,将需要解决的大问题逐步分解成小问题,直到达到一个基线。
快速排序的思路:
1.选择一个基线作为中值,将所有比这个基线小的值放在一个数组里,比基线大的值放在另一个数组里,即[小于基线]+基线+[大于基线]
2.随后再将基线两边的数组进行递归,直到基线左右的数都小于1个时即停止递归。
Python代码如下:
def quick_sort(nums):
if len(nums) < 2:
return nums
mid = nums[0]
lower = [i for i in nums[1:] if i <= mid]
higher = [i for i in nums[1:] if i > mid]
return quick_sort(lower) + [mid] + quick_sort(higher)
nums = [34,21,3,4,67,1,2,2,1]
print(quick_sort(nums))
上面的代码参考自《算法图解》一书,该方法的平均时间复杂度为O(nlogn),其中n为每次递归所需要的操作次数,logn为递归的次数,即栈的深度。该方法的空间复杂度同样为O(nlogn)使用了较多的额外数组空间。
下面的代码参考自北京图灵学院的讲义,使用了原地交换的方法,使用了较少的额外空间。
def quick_sort2(nums, start,end):
'''
nums: list
start: 初始位置
end: 结束位置
'''
# 结束条件
if start >= end:
return
# 基准值
basic = nums[start]
# 两个游标
low = start
high = end
while low < high:
#从后开始往前找,找到比基准值小的数时,将其放在前面的空位上
#(由于基准值已保存,因此空出空位,当这个数放到其他位置上时,该位置也产生一个空位)
while low < high and nums[high] >= basic:
high -= 1
nums[low] = nums[high]
#从前往后找,找到比基准值大的数时,放到后面的空位去
while low < high and nums[low] <= basic:
low += 1
nums[high] = nums[low]
#将基准值放回中间的空位上,由于此时low与high重合,因此使用任意指针皆可
nums[low] = basic
#分别递归
quick_sort2(nums,start ,low-1)
quick_sort2(nums, high+1, end)
nums = [34,4,214,5,32,2,1]
quick_sort2(nums,0,len(nums)-1)
print(nums)