python實現快速排序(演算法4)
阿新 • • 發佈:2021-07-29
- 時間複雜度:
- 最好:nlog n
- 最壞:n*n
- 平均:nlog n
- 空間複雜度:log n
- 穩定性:不穩定
遞迴實現
def quick_sort(arr, first, last): if first >= last: return pivot = partition2(arr, first, last) quick_sort(arr, first, pivot - 1) quick_sort(arr, pivot + 1, last) # 經典,好理解 def partition2(arr, lo, hi): i , j, pivot = lo+1, hi, arr[lo] # left and right scan indices, partition item while True: # scan right, scan left, check for scan complete, and exchange while arr[i] < pivot: i += 1 if i == hi: break while arr[j] > pivot: j -= 1 if j == hi: break if i >=j: break arr[i], arr[j] = arr[j], arr[i] arr[lo], arr[j] = arr[j], arr[lo] # exchange, put pivot to right place return j
3way遞迴實現
def quick3way(arr, lo, hi): if hi <= lo: return lt, i, gt, pivot = lo, lo+1, hi, arr[lo] while i <= gt: if arr[i] < pivot: arr[lt], arr[i] = arr[i], arr[lt] lt += 1 i += 1 elif arr[i] > pivot: arr[i],arr[gt] = arr[gt], arr[i] gt -= 1 else: i += 1 quick3way(arr, lo, lt -1) quick3way(arr, lt+1, hi) return arr
迴圈實現
def quick_sort_no_recursion(arr, first, last): if first >= last: return arr stack = [first, last] while stack: first, last = stack.pop(0), stack.pop(0) # 移除列表中的第一個元素 if first >= last: continue i, pivot = first - 1, arr[last] # 最後一個元素為基準值 for j in range(first, last + 1): if arr[j] <= pivot: # 從頭向後找第一個大於基準的數 i += 1 # 沒找到則i+1, 都是比基準小的數 arr[i], arr[j] = arr[j], arr[i] # 交換這兩數, 利用了python特性,arr[-1]即是陣列最後一個元素 stack.extend([first, i - 1, i + 1, last]) # 在列表後追加 return arr