1. 程式人生 > >【轉載】快速排序(三種演算法實現和非遞迴實現)

【轉載】快速排序(三種演算法實現和非遞迴實現)

原文地址 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)