1. 程式人生 > >python對常見排序演算法的實現

python對常見排序演算法的實現

import random


def random_nums_generator(max_value=1000, total_nums=20):
    """
    隨機數列表生成器
    一些常用函式:
    random隨機數生成
    random.random()用於生成一個0到1之間的隨機數:0 <= n < 1.0;
    random.uniform(a, b),用於生成一個指定範圍內的隨機符點數,兩個引數其中一個是上限,一個是下限。min(a,b) <= n <= max(a,b);
    random.randint(a, b), 用於生成一個指定範圍內的整數,其中a是下限,b是上限: a<= n <= b;
    random.randrange(start, stop, step), 從指定範圍內,按指定基數遞增的集合獲取一個隨機數;
    random.choice(sequence), 從序列中獲取一個隨機元素;
    random.shuffle(x), 用於將一個列表中的元素打亂;
    random.sample(sequence, k), 從指定序列中隨機獲取指定長度的片斷;
    """
    num_list = []
    for i in range(total_nums):
        num_list.append(random.randint(0, max_value))
    return num_list


def bubble_sort(arr):
    """
    氣泡排序,思想為比較相鄰兩個數,使較大(arr[j] > arr[j+1])或者較小(arr[j] < arr[j+1])的數一直往後推。
    時間複雜度O(n^2),空間複雜度O(1)
    """
    L = len(arr)
    for i in range(L):
        for j in range(L)[:-i - 1]:
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr


def insert_sort(arr):
    """
    插入排序,思想為將數插入到適合他大小的位置中。
    時間複雜度O(n^2),空間複雜度O(1)
    """
    L = len(arr)
    ans = []
    for i in range(L):
        for j in range(i + 1):
            if arr[i] < arr[j]:
                ans.insert(j, arr[i])
                break
            else:
                ans.append(arr[i])
                break
    return ans


def select_sort(arr):
    """
    選擇排序,思想為選出最大或最小的數放在首位
    時間複雜度O(n^2),空間複雜度O(1)
    """
    L = len(arr)
    ans = []
    for i in range(L):
        min_num = arr[i]
        for j in range(i, L):
            if arr[j] < min_num:
                min_num = arr[j]
        ans.append(min_num)
    return ans


def merge_sort(arr):
    """
    歸併排序,思想為利用遞迴將多個子表合併為一個有序表
    時間複雜度O(nlogn),空間複雜度O(1)
    """
    L = len(arr)
    if L <= 1:
        return arr
    middle = L // 2
    arr_left = merge_sort(arr[:middle])
    arr_right = merge_sort(arr[middle:len(arr)])
    new_arr = []
    while len(arr_left) and len(arr_right):
        if arr_right[0] < arr_left[0]:
            new_arr.append(arr_right.pop(0))
        else:
            new_arr.append(arr_left.pop(0))
    new_arr += arr_left
    new_arr += arr_right
    return new_arr


def quick_sort(arr):
    """
    快速排序:思想為找一個基準,將小的放在前面,大的放在後面。
    時間複雜度:O(nlogn),空間複雜度:O(nlogn)
    """
    L = len(arr)
    if L <= 1:
        return arr
    arr_left = []
    arr_right = []
    base = arr[0]
    for i in range(1, L):
        if arr[i] <= base:
            arr_left.append(arr[i])
        else:
            arr_right.append(arr[i])
    return quick_sort(arr_left) + [base] + quick_sort(arr_right)


numarr = random_nums_generator(100, 20)
print(numarr)
print('bubble_sort:', bubble_sort(numarr))
print('insert_sort:', insert_sort(numarr))
print('select_sort:', select_sort(numarr))
print('merge_sort:', merge_sort(numarr))
print('quick_sort:', quick_sort(numarr))

直接上程式碼了,都挺容易懂得,最好能自己實現一下印象更深刻些。執行結果如下

[57, 61, 94, 82, 81, 11, 22, 73, 75, 50, 81, 54, 92, 73, 95, 15, 50, 35, 6, 45]
bubble_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95]
insert_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95]
select_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95]
merge_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95]
quick_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95]