六大排序代码实现

from turtle import left


def bubble_sort(alist):
    """
        冒泡排序法实现升序排序
    """
    n = len(alist)

    for j in range(n - 1):  # 大循环控制每个数都进行冒泡
        for i in range(n - 1 - j):  # 具体的冒泡排序
            if alist[i] > alist[i + 1]:
                alist[i + 1], alist[i] = alist[i], alist[i + 1]


def selection_sort(alist):
    """
        选择排序法实现升序排序
    """
    n = len(alist)

    for j in range(n - 1):  # 因为数组的长度为n, 所以我们需要比较n次(这里的n从0开始)
        min_idx = j  # 第j的空位(从头到尾, 每个空位都需要填满数)
        for i in range(j + 1, n):  # j前面的数已经空位已经满了,从j+1开始是因为没有必要自己和自己比较
            if alist[min_idx] > alist[
                    i]:  # 因为是升序排序,如果我们的空位数的值比其他数大,那么把min_idx换了,再接着比较
                min_idx = i
        # 比较完毕,说明此时的min_idx是最小的数,因此让它去填补空位
        alist[j], alist[min_idx] = alist[min_idx], alist[j]


def insertion_sort(alist):
    """
        插入排序实现升序排序
    """
    n = len(alist)

    for i in range(
            1,
            n):  # i ∈ [1, n-1] -> 比较n-1次(这里i从1开始是因为下一个for循环是从逆着来的,逆着的索引是从1开始的)
        for j in range(i, 0, -1):  # 从第i个元素从后往前数(步长为1)
            if alist[j] < alist[j - 1]:  # 只有有比自己小的,立马交互位置
                alist[j], alist[j - 1] = alist[j - 1], alist[j]


def quick_sort(alist, first, last):
    """
        使用快速排序实现升序排序
    """
    if first >= last:  # 递归的终止条件(当first == last时,序列中只有一个元素;当first > last -> 左边的指针都跑到右边指针的右方了,停止)
        return

    mid_value = alist[first]  # 存放中间值
    low = first  # 左边的指针
    high = last  # 右边的指针

    while low < high:  # low和high没有相遇
        while low < high and alist[high] >= mid_value:
            high -= 1  # high指针继续走
        # while循环结束,说明此时high走不动了
        alist[low] = alist[high]

        while low < high and alist[low] < mid_value:
            low += 1  # low指针继续走
        # while循环退出,说明此时low走不动了
        alist[high] = alist[low]

    # 退出大的while循环,说明此时low和high相遇 -> alist[low] == alist[high]
    alist[low] = mid_value  # 将一开始存放的值放到对的位置上

    # 此时序列被分为了两个,接下来使用递归分别对两边的序列执行快排
    quick_sort(alist, first, low - 1)
    quick_sort(alist, low + 1, last)


def shell_sort(alist):
    """
        使用希尔排序实现升序排序
    """

    n = len(alist)

    gap = n // 2

    i = None  # 这里的i是一个占位符

    while gap > 0:
        for j in range(gap, n):  # 这里其实就是插入排序
            i = j
            while i > 0:
                if alist[i] < alist[i - gap]:
                    alist[i], alist[i - gap] = alist[i - gap], alist[i]
                    i -= gap
                else:
                    break
        gap //= 2


def merge_sort(alist):
    """
        使用归并排序实现升序排序
    """
    n = len(alist)

    if n <= 1:  # 拆分到每个序列的长度为1时 -> 停止拆分
        return alist

    mid = n // 2

    left_ls = merge_sort(alist[:mid])
    right_ls = merge_sort(alist[mid:])

    left_cursor, right_cursor = 0, 0  # 两个指针都指向序列的开头

    res = []  # 存放排序结果

    while left_cursor < len(left_ls) and right_cursor < len(right_ls):
        if left_ls[left_cursor] <= right_ls[right_cursor]:  # 对两个指针的值进行比较
            res.append(left_ls[left_cursor])  # 将小的值取出来
            left_cursor += 1
        else:
            res.append(right_ls[right_cursor])  # 将小的值取出来
            right_cursor += 1

    # 退出循环,将两个数组后面的数追加到结果中
    res += left_ls[left_cursor:]
    res += right_ls[right_cursor:]

    return res


if __name__ == "__main__":
    ls_bubble = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    bubble_sort(ls_bubble)
    print(ls_bubble)  # [17, 20, 26, 31, 44, 54, 55, 77, 93]

    ls_selection = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    selection_sort(ls_selection)
    print(ls_selection)  # [17, 20, 26, 31, 44, 54, 55, 77, 93]

    ls_insertion = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    insertion_sort(ls_insertion)
    print(ls_insertion)  # [17, 20, 26, 31, 44, 54, 55, 77, 93]

    ls_quick = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    quick_sort(ls_quick, first=0, last=len(ls_quick) - 1)
    print(ls_quick)  # [17, 20, 26, 31, 44, 54, 55, 77, 93]

    ls_shell = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    shell_sort(ls_shell)
    print(ls_shell)  # [17, 20, 26, 31, 44, 54, 55, 77, 93]

    ls_merge = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    new_ls = merge_sort(ls_merge)
    print(new_ls)  # [17, 20, 26, 31, 44, 54, 55, 77, 93]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值