前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现6种排序算法,快排只有6行?

Python实现6种排序算法,快排只有6行?

作者头像
小萌哥
发布2020-07-21 11:34:53
5130
发布2020-07-21 11:34:53
举报
文章被收录于专栏:算法研习社算法研习社

通过实现 6 种经典的排序算法,尽展 Python 的简而美~

  • 快速排序
  • 归并排序
  • 堆排序
  • 插入排序
  • 冒泡排序
  • 选择排序

快速排序

def quick_sort(arr):
    if len(arr) < 2:
        return arr[:]
    left = quick_sort([i for i in arr[1:] if i <= arr[0]])
    right = quick_sort([i for i in arr[1:] if i > arr[0]])
    return left + [arr[0]] + right

经典快排实现


def quick_sort(arr):
    def partition(arr, s, e):
        key = arr[0]
        while s < e:
            while s < e and arr[e] >= key: e -= 1
            arr[s] = arr[e]
            while s < e and arr[s] <= key: s += 1
            arr[e] = arr[s]
        return s

    def quick_sort_recursion(arr, s, e):
        if s < e:
            idx = partition(arr, s, e)
            quick_sort_recursion(arr, s, idx - 1)
            quick_sort_recursion(arr, idx + 1, e)

    quick_sort_recursion(arr, 0, len(arr) - 1)
    return arr

归并排序

def merge_sort(arr):
    def merge(left, right):
        rs = []
        i = j = 0
        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                rs.append(left[i])
                i += 1
            else:
                rs.append(right[j])
                j += 1
        rs += left[i:]
        rs += right[j:]
        return rs

    def merge_sort_recursion(arr):
        if len(arr) in [0, 1]:  # 停止分裂,最小子问题
            return arr
        mid = len(arr) // 2
        left = merge_sort_recursion(arr[:mid])
        right = merge_sort_recursion(arr[mid:])
        return merge(left, right)

    return merge_sort_recursion(arr)

堆排序

def heap_sort(arr):
    def init_heap(arr):
        n = len(arr)
        last_parent = (n - 1) // 2  # 最后一个parent节点
        for i in range(last_parent, -1, -1):
            adjust_heap(arr, n, i)

    def adjust_heap(arr, max_length, parent):
        left = 2 * parent + 1
        right = 2 * parent + 2
        largest = parent

        if left < max_length and arr[left] > arr[largest]:
            largest = left
        if right < max_length and arr[right] > arr[largest]:
            largest = right
        if parent != largest:
            arr[parent], arr[largest] = arr[largest], arr[parent]
            adjust_heap(arr, max_length, largest)

    init_heap(arr) #初始化大顶堆
    for i in range(len(arr) - 1, -1, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 每次将最大值移到最后
        adjust_heap(arr, i, 0)
    return arr

插入排序

def insert_sort(arr):
    for i in range(1, len(arr)):
        for j in range(i, 0, -1):
            if arr[j] < arr[j - 1]:
                arr[j], arr[j - 1] = arr[j - 1], arr[j]
            else:
                break
    return arr

冒泡排序

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

选择排序


def select_sort(arr):
    n = len(arr)
    for i in range(0, n - 1):
        min_idx = i
        for j in range(i + 1, n):
            if arr[j] < arr[i]:
                min_idx = j
        if i != min_idx:
            arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

测试程序

if __name__ == '__main__':
    import numpy as np
    arr = list(np.random.randint(0, 100, 100))

    print(quick_sort(arr))
    print(merge_sort(arr))
    print(heap_sort(arr))
    print(bubble_sort(arr))
    print(select_sort(arr))
    print(insert_sort(arr))
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 快速排序
  • 归并排序
  • 堆排序
  • 插入排序
  • 冒泡排序
  • 选择排序
  • 测试程序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档