算法实例-Python

算法实例

简易桶排序

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) 

#

猜你喜欢

转载自www.cnblogs.com/chenxygx/p/9615006.html