2021-02-26 排序

排序

在这里插入图片描述

冒泡排序

在这里插入图片描述

def bubble_sort(a):
    for i in range(0, len(a) - 1):
        count = 0
        for j in range(0, len(a) - 1 - i):
            if a[j] > a[j + 1]:
                a[j], a[j + 1] = a[j + 1], a[j]
                count += 1
        if count == 0:
            return


if __name__ == "__main__":
    list_a = [4, 9, 5, 3]
    bubble_sort(list_a)
    print(list_a)

选择排序

在这里插入图片描述

def select_sort(a):
    for i in range(0, len(a)-1):
        max_index = 0
        for j in range(1, len(a)-i):
            if a[max_index] < a[j]:
                max_index = j
        a[len(a)-1-i], a[max_index] = a[max_index], a[len(a)-1-i]


if __name__ == "__main__":
    list_a = [4, 9, 5, 3]
    select_sort(list_a)
    print(list_a)

插入排序

在这里插入图片描述

def insert_sort(a):
    for i in range(1, len(a)):
        '''first version
        cur = a[i]
        for j in range(i-1, -1, -1):
            if cur < a[j]:
                a[j+1] = a[j]
                a[j] = cur
        '''
        ''''second version
                for j in range(i, 0, -1):
            if a[j] < a[j-1]:
                a[j], a[j-1] = a[j-1], a[j]
            else:
                break
        '''
        '''third version'''
        j = i
        while j > 0:
            if a[j] < a[j - 1]:
                a[j], a[j - 1] = a[j - 1], a[j]
                j -= 1
            else:
                break


if __name__ == "__main__":
    list_a = [4, 9, 5, 3]
    insert_sort(list_a)
    print(list_a)

    list_b = [93, 54, 77, 31, 44, 55, 226]
    insert_sort(list_b)
    print(list_b)

希尔排序

在这里插入图片描述

def shell_sort(a, gap):
    while gap > 0:
        for j in range(gap,len(a)):
            i = j
            while i >= gap:
                if a[i] < a[i - gap]:
                    a[i], a[i - gap] = a[i - gap], a[i]
                    i -= gap
                else:
                    break
        gap = gap//2


if __name__ == "__main__":
    list_a = [4, 9, 5, 3]
    shell_sort(list_a, 2)
    print(list_a)

    list_b = [93, 54, 77, 31, 44, 55, 226]
    shell_sort(list_b, 3)
    print(list_b)

快速排序

在这里插入图片描述
在这里插入图片描述

def quick_sort(a, start, end):
    # 递归的退出条件
    if start >= end:
        return

    mid_value = a[start]
    low_index = start
    high_index = end

    ''' 相遇前:part1 part2 交替执行'''
    while low_index < high_index:
        '''part1: high_index 移动过程'''
        '''考虑特殊的等于情况!这里将等于的元素都放到左边'''
        while high_index > low_index and a[high_index] >= mid_value:
            high_index -= 1
        a[low_index] = a[high_index]
        # print("high")
        # print(a)

        '''part2: low index 移动过程'''
        while low_index < high_index and a[low_index] < mid_value:
            low_index += 1
        a[high_index] = a[low_index]
        # print("low")
        # print(a)

    '''退出循环时, low_index == high_index'''
    a[low_index] = mid_value
    # print("one round")
    # print(a)
    # print(low_index)
    '''递归
    注意:为什么要用start和end参数->直接切片会产生新的列表,而不会修改原有列表!
    对基准元素左边的子序列进行快速排序'''
    quick_sort(a, start, low_index - 1)
    '''对基准元素右边的子序列进行快速排序'''
    quick_sort(a, low_index + 1, end)


if __name__ == "__main__":
    list_a = [4, 9, 5, 3]
    quick_sort(list_a, 0, len(list_a) - 1)
    print(list_a)

    list_b = [93, 54, 77, 31, 44, 54, 55, 226]
    quick_sort(list_b, 0, len(list_b) - 1)
    print(list_b)

归并排序

在这里插入图片描述

def merge_sort(a):
    if len(a) <= 1:
        return a
    # 二分分解
    num = len(a) // 2
    left = merge_sort(a[:num])
    right = merge_sort(a[num:])
    # 合并
    # list本身不变!!!!返回了新的list
    return merge(left, right)


def merge(a, b):
    a_index = 0
    b_index = 0
    result = []
    while a_index < len(a) and b_index < len(b):
        if a[a_index] < b[b_index]:
            result.append(a[a_index])
            a_index += 1
        else:
            result.append(b[b_index])
            b_index += 1
    # 注意加上剩下的元素
    result += a[a_index:]
    result += b[b_index:]
    return result


if __name__ == "__main__":
    list_a = [4, 9, 5, 3]
    print(merge_sort(list_a))
    print(list_a)

    list_b = [93, 54, 77, 31, 44, 54, 55, 226]
    print(merge_sort(list_b))
    print(list_b)

常见排序方法比较

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值