基数排序
from typing import List
def radix_sort(arr: List) -> List:
"""
基础排序
核心思想: 一共有0-9为数字的桶,一共10个,一共循环数组中最大数的位数次(如最大数是1000则是4次个十百千位分别循环),
每一次循环依次从数中取出个、十、百、千、万...位数上的数值放到对应的桶中,如果该位上没有数字补零,
然后依次从0-9桶中取出组成一个新的临时数组作为下一次循环的输入,
一直到循环到最高位,最后依次得到的结果即是有序。(此法只适合正整数的排序)
:param arr:
:return:
"""
max_val = max(arr)
max_len = len(str(max_val))
for i in range(0, max_len):
bracket = [[] for _ in range(10)]
for j in range(len(arr)):
num = int(arr[j] / 10 ** i % 10)
bracket[num].append(arr[j])
arr = []
for items in bracket:
if items is not []:
arr.extend(items)
return arr
if __name__ == '__main__':
arr = [4, 1, 5, 7, 6, 15, 55, 72, 666]
arr2 = radix_sort(arr)
print(arr2)
print(arr)
堆排序
def heap_sort(arr):
"""
堆排序
:param arr:
:return:
"""
length = len(arr)
for i in range(length // 2 - 1, -1, -1):
adjust_heap(arr, i, length)
for j in range(length - 1, -1, -1):
arr[0], arr[j] = arr[j], arr[0]
adjust_heap(arr, 0, j)
def adjust_heap(arr, index, length):
"""
调整成大顶堆
:param arr:
:return:
"""
temp = arr[index]
k = 2 * index + 1
while k < length:
if k + 1 < length and arr[k] < arr[k + 1]:
k += 1
if temp < arr[k]:
arr[index] = arr[k]
index = k
else:
break
k = 2 * k + 1
arr[index] = temp
if __name__ == '__main__':
arr = [-1, 1, 3, 7, 9, 55, 1, -1]
heap_sort(arr)
print(arr)