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)
