【轉載】快速排序(三種演算法實現和非遞迴實現)
阿新 • • 發佈:2018-12-19
原文地址 python實現:
import random a = [4,1,7,6,9,2,2,3,5,7,8,9,3,1,2,3,4,5,8,0,3,5] b = [4,1,7,6,9,2,8,0,3,5] def twoPointerSort(nums,left,right): key = random.randint(left,right) nums[right],nums[key] = nums[key],nums[right] key = right while left<right: while left<right and nums[left]<=nums[key]: left += 1 while left<right and nums[right]>=nums[key]: right -= 1 nums[left],nums[right]=nums[right],nums[left] if left<key: nums[left],nums[key] = nums[key],nums[left] return left twoPointerSort(b,0,len(b)-1) print(b) def diggingSort(nums,left,right): key = nums[right] while left<right: while left<right and nums[left]<=key: left += 1 nums[right] = nums[left] while left<right and nums[right]>=key: right -= 1 nums[left] = nums[right] nums[left] = key return left def slowFastSort(nums,left,right): i = left for j in range(left,right): if nums[j]<=nums[right]: nums[i],nums[j] = nums[j],nums[i] i += 1 nums[i],nums[right] = nums[right],nums[i] return i def quickSort(nums): stack = [0,len(nums)-1] while stack: right = stack.pop() left = stack.pop() pivot = twoPointerSort(nums,left,right) if left < pivot-1: stack.append(left) stack.append(pivot-1) if right > pivot+1: stack.append(pivot+1) stack.append(right) def quickSortFlatten(nums): stack = [0,len(nums)-1] while stack: right = stack.pop() left = stack.pop() i = left key = random.randint(left,right) nums[key],nums[right] = nums[right],nums[key] for j in range(left,right): if nums[j]<=nums[right]: nums[i],nums[j] = nums[j],nums[i] i += 1 nums[i],nums[right] = nums[right],nums[i] pivot = i if left < pivot-1: stack.append(left) stack.append(pivot-1) if right > pivot+1: stack.append(pivot+1) stack.append(right) quickSortFlatten(a) print(a)