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]

猜你喜欢

转载自blog.csdn.net/u010949998/article/details/81569288