快排,归并,冒泡

2018-08-22  本文已影响0人  MkTom

快排代码


def quick_sort(li, start, end):
    if start >= end:
        return
    # 定义两个游标
    left = start
    right = end
    # 取0位置的数据,作为中间值
    mid = li[start]
    while left < right:
        # 让右边游标的下标往左移动,目的找到小于mid的数据,放到左边游标位置
        while left < right and li[right] >= mid:
            right -= 1
        li[left] = li[right]
        # 让左边游标的下标往右移动,目的找到大于mid的数据,放到右边游标位置
        while left < right and li[left] < mid:
            left += 1
        li[right] = li[left]
    # left=right,把mid放到此位置
    li[left] = mid
    # 对左右数据分别进行递归
    quick_sort(li, start, left-1)
    quick_sort(li, left+1, end)

if __name__ == '__main__':
    l = [2,5,1,4,3]
    # l = 2 [1,5,5,4,3]
    quick_sort(l,0,len(l)-1)
    print(l)

    # 稳定性:不稳定
    # 最坏时间复杂度:O(n^2)
    # 最优时间复杂度:O(nlogn)

归并代码

# [6,2,5,1,4,3]


def merge_sort(li):
    n = len(li)
    if n == 1:
        # print(li)
        return li

    # 根据列表长度获取中间位置
    mid = n//2
    # 把列表拆分成两半
    left = li[:mid]
    right = li[mid:]

    # print(left)
    # print(right)
    # 递归拆分左边
    left_res = merge_sort(left)
    # 递归拆分右边
    right_res = merge_sort(right)
    # res = left_res + right_res
    # 把下层方法返回的结果,组成有序
    res = merge(left_res, right_res)
    # print(res)
    return res


def merge(ll,rl):

    # 把两个有序序列,再组成有序
    # [2,5,6]   [1,3,4]
    l_index = 0
    r_index = 0
    # 定义临时结果列表
    res = []
    while l_index < len(ll) and r_index < len(rl):

        if ll[l_index] <= rl[r_index]:
            res.append(ll[l_index])
            l_index += 1
        else:
            res.append(rl[r_index])
            r_index += 1
    # 循环结束,肯定有一个列表的数据全部加入到结果
    res = res + ll[l_index:]
    res = res + rl[r_index:]
    return res


if __name__ == '__main__':
    l = [6,5,4,3,2,1]
    print(merge_sort(l))
    # l=[2, 5, 6]
    # r=[1, 3, 4,7,8]
    # print(merge(l,r))

    # 稳定性:稳定
    # 最坏时间复杂度:O(nlogn)
    # 最优时间复杂度:O(nlogn)

冒泡排序

def bubble_sort(li):

    n = len(li)
    # 让内部循环执行n-1次
    for j in range(n-1):  # 0 1 2 3

        count = 0
        # 定义游标,遍历列表,游标从0移动到倒数第二个位置
        for i in range(n-1-j):  # n-1 n-2 n-3
            # 比较当前游标位置和下一个位置的数据
            if li[i] > li[i+1]:
                li[i], li[i+1] = li[i+1], li[i]
                count += 1

        # 内部循环一次后,从来没有交换过,可以证明数据已经有序
        if count == 0:
            break

if __name__ == '__main__':
    l = [1,2,4,4,5]
    bubble_sort(l)
    print(l)

    # 稳定性:稳定
    # 最坏时间复杂度:O(n^2)
    # 最优时间复杂度:O(n)
上一篇 下一篇

猜你喜欢

热点阅读