Happyunlimited 2019-12-25
希尔排序是一个叫希尔的数学家提出的一种优化版本的插入排序。
# 希尔排序 def shell_sort(li): n = len(li) gap = n // 2 while gap > 0: for i in range(gap, n): temp = li[i] j = i - gap while j >= 0 and li[j] > temp: li[j + gap] = li[j] j -= gap li[j + gap] = temp gap //= 2
def count_sort(li, max_num=100): count = [0 for _ in range(max_num + 1)] for val in li: count[val] += 1 li.clear() # 表示i这个数出现了v次 for i, v in enumerate(count): for _ in range(v): li.append(i)
假定原始数列的规模是N
最大值和最小值的差是M
计数排序的时间复杂度是O(N+M)
如果不考虑结果数组,只考虑中间数组大小的话,空间复杂度是O(M)
基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
多关键字排序:现在有一个员工,要求按照薪资排序,年龄相同的员工按照按照年龄排序。
先按照年龄进行排序,再按照薪资进行稳定的排序。
对32,13,94,52,17,54,93进行排序,是否可以看作多关键字排序?
# 基数排序 def radix_sort(li): max_num = max(li) i = 0 while (10 ** i <= max_num): buckets = [[] for _ in range(10)] for val in li: # i=0 个位 i=1 十位 i=2 百位 .. digit = val // (10**i) % 10 buckets[digit].append(val) li.clear() for bucket in buckets: for val in bucket: li.append(val) i += 1
~>.<~