本文共 1623 字,大约阅读时间需要 5 分钟。
快速排序
也是分治法。很多标准语言的排序方法,最优的算法复杂度比较好。 原理:定一个主元,左边指针从左往右,右边指针从右往左,把与主元小的元素,把主元函数和这个元素调换位置。 方案1 :缺点需要额外内存空间def quicksort(array): if len(array) < 2: return array else: pivot_index = 0 pivot = array[pivot_index] less_port = [i for i in array[pivot_index+1:] if i <=pivot] great_port = [i for i in array[pivot_index+1:] if i > pivot] return quicksort(less_port) + [pivot] + quicksort(great_port)def test_quicksort(): import random seq = list(range(10)) random.shuffle(seq) assert quicksort(seq) == sorted(seq)
方案二:
"""方案2"""def portition(array, beg, end): pivot_index = beg pivot = array[pivot_index] left = pivot_index + 1 right = end - 1 while True: while left <= right and array[left] < pivot: left += 1 while right >= left and array[right] >= pivot: right -= 1 if left > right: break else: array[left], array[right] = array[right], array[left] array[pivot_index], array[right] = array[right], array[pivot_index] return rightdef test_portition(): l = [4, 1, 2, 8] assert portition(l, 0, len(l)) == 2 l = [1, 2, 3, 4] assert portition(l, 0, len(l)) == 0 l = [4, 3, 2, 1] assert portition(l, 0, len(l)) == 3
def quicksort_inplace(array, beg, end): if beg < end: pivot = portition(array, beg, end) quicksort_inplace(array, beg, pivot) quicksort_inplace(array, pivot+1, end)def test_quicksort_inplace(): import random seq = list(range(10)) random.shuffle(seq) print(seq) quicksort_inplace(seq, 0, len(seq)) print(seq)
转载地址:http://ismsz.baihongyu.com/