原文地址
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):
pre = left
for cur in range(left,right):
if nums[cur]<=nums[right]:
if cur!=pre:
nums[cur],nums[pre] = nums[pre],nums[cur]
pre += 1
nums[pre],nums[right] = nums[right],nums[pre]
return pre
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)