排序–快排的两种写法
之前的博客记录过各种排序
快排算法代码如下,该方法思路很直接也很清晰,但是在生成left和right时会需要新的空间,所以其空间复杂度要高一些。
def quick_sort(li):
if len(li) < 2: return li
tmp = li[0] #快排中将序列分为左右的值
left = [x for x in li if x < tmp]
middle = [x for x in li if x == tmp]
right= [x for x in li if x > tmp]
return quick_sort(left) + middle + quick_sort(right)
上面方式实现的快速排序所需要的空间复杂度会高,在面试时手撕快排时,面试官让换一种方法写,也就是不断原地交互从而达到排序效果。
def quick_sort(li, first, last):
if first >= last: return
mid_value = li[first]
low = first
high = last
while low < high:
while low < high and li[high] >= mid_value :
high -= 1
li[low] = li[high]
while low < high and li[low] <= mid_value :
low += 1
li[high] = li[low]
li[low] = mid_value #此时退出循环,low和high重合
quick_sort(li, first, low-1) #这里不能用切片,因为切片就产生了新的list,并不会在原list上排序
quick_sort(li, low+1, last)
return li