算法实例
简易桶排序
input = [7, 3, 1, 9, 7, 4, 6, 5, 0, 1] T = [0] * (max(input) + 1) for i in range(len(input)): T[input[i]] += 1 for i in range(0, len(T) - 1): for j in range(0, T[i]): print("{0}".format(i))
数字间隔不大,使用一组数组来当作桶,进行插入排序。桶排序主要就是利用下标的输出,然后根据数值循环下表。
时间复杂度:O(M+N)
用大写字母O来表示时间复杂度,算法的时间复杂度是O(2n+m),可以忽略较小的常数。
冒泡排序
input = [7, 3, 1, 9, 7, 4, 6, 5, 0, 1] n = len(input) - 1 for i in range(n): for j in range(n, i, -1): if input[j - 1] > input[j]: S = input[j] input[j] = input[j - 1] input[j - 1] = S print(input)
最慢的一种方法,如果只是一个一个比较,尾部出现小数问题严重影响速度
时间复杂度:O(N2)
双向冒泡
冒泡基础上由两个方向同时进行,只是解决了尾部小数问题,效率也不高
input = [7, 3, 1, 9, 7, 4, 6, 5, 0, 1] n = len(input) st = -1 swapped = True while st < n and swapped: n -= 1 st += 1 swapped = False for j in range(st, n): if input[j] > input[j + 1]: S = input[j] input[j] = input[j + 1] input[j + 1] = S swapped = True for j in range(n - 1, st - 1, -1): if input[j] > input[j + 1]: S = input[j] input[j] = input[j + 1] input[j + 1] = S swapped = True print(input)
时间复杂度:O(N2)
梳排序
保持间距并不断减少,开始的时候设定为列表长度,然后每一次都会除以损耗因子。间距可以四舍五入,不断重复,直到间距变成1
input = [7, 3, 1, 9, 7, 4, 6, 5, 0, 1] n = len(input) swaps = 1 while n != 1 or swaps == 0: n = int(n / 1.3) if n < 1: n = 1 i = 0 swaps = 0 while i + n < len(input): if input[i] > input[i + n]: S = input[i] input[i] = input[i + n] input[i + n] = S swaps = 1 i += 1 print(input)
时间复杂度:O(Nlog2N)
#