# 快速排序遞歸玩法 def quicksort(arr): # 結束條件 if len(arr) <= 1: return arr # 用中間值更穩定 middle = arr[len(arr) // 2] # 記得將middle拿出來,最後再放到中間 del arr[len(arr) // 2] # 利用列表生成式,100W數據,2.9s # left = [x for x in arr if x <= middle] # right = [x for x in arr if x > middle] # 2.6s left = [] right = [] for x in arr: left.append(x) if x <= middle else right.append(x) # 記得把middle放中間 return quicksort(left) + [middle] + quicksort(right) # 非遞歸玩法 def quicksort2(arr): ''' 模擬棧操做實現非遞歸的快速排序 ''' if len(arr) < 2: return arr stack = [] stack.append(len(arr) - 1) stack.append(0) while stack: l = stack.pop() r = stack.pop() index = partition(arr, l, r) if l < index - 1: stack.append(index - 1) stack.append(l) if r > index + 1: stack.append(r) stack.append(index + 1) def partition(arr, start, end): # 分區操做,返回基準線下標 pivot = arr[start] while start < end: while start < end and arr[end] >= pivot: end -= 1 arr[start] = arr[end] while start < end and arr[start] <= pivot: start += 1 arr[end] = arr[start] # 此時start = end arr[start] = pivot return start if __name__ == '__main__': li = list(range(1000000)) import random random.shuffle(li) sorted = quicksort(li) print(sorted[:10])
快速排序。app