0
点赞
收藏
分享

微信扫一扫

Python 桶排序+快排

忍禁 2022-04-13 阅读 61
import math
def quickSort(arr, i, j):
    if i >= j:
        return
    up = j
    down = i
    while j > i:
        if arr[j] >= arr[down]:
            j -= 1
        elif arr[i] <= arr[down]:
            i += 1
        else:
            temp = arr[j]
            arr[j] = arr[i]
            arr[i] = temp
    temp = arr[i]
    arr[i] = arr[down]
    arr[down] = temp  # i 或者 j 都可以
    quickSort(arr, down, j - 1)
    quickSort(arr, j + 1, up)
    

def initBucker(bucket, minNum, maxNum):
    i = 1
    step = minNum
    while step < maxNum:
        bucket.append([])
        step += 2 ** i
        i += 1
        

def buckerSort(arr):
    bucket = []
    maxNum = arr[0]
    minNum = maxNum
    for i in arr:
        if i > maxNum:
            maxNum = i
        if i < minNum:
            minNum = i
    initBucker(bucket, minNum, maxNum)
    for i in arr:
        interval = i - minNum
        index = int(math.log(interval + 2, 2)) - 1  # 2的n + 1次方 - 2 为 除去第一项的等比为2的前n项和
        bucket[index].append(i)
    
    i = 0
    length = len(bucket)
    while i < length:
        if len(bucket[i]) == 0:
            bucket.pop(i)
            length -= 1
        else:
            quickSort(bucket[i], 0, len(bucket[i]) - 1)
            i += 1
    
    index = 0     
    for i in bucket:
        for j in i:
            arr[index] = j
            index += 1
            
    
arr = [18, 11, 28, 45 ,23 ,50]
buckerSort(arr)
# quickSort(arr, 0, len(arr) - 1)
print(arr)

举报

相关推荐

0 条评论