插入排序,选择排序,归并排序和快速排序

1. 插入排序

图1 插入排序(图片引用来自:https://cuijiahua.com/blog/2017/12/algorithm_2.html)
def insert_sorting(lst):
    for i in range(1,len(lst)):
        while lst[i] < lst[i-1] and i > 0:
            lst[i], lst[i-1] = lst[i-1], lst[i]
            i -= 1
    return lst

2. 选择排序

图2 选择排序(图片引用来自:https://cuijiahua.com/blog/2017/12/algorithm_5.html)

在这里插入图片描述

"找到给定list中最小元素的index"
def find_min_index(lst):
	#假设最小是lst[0],对比后有更小的将之替换
    smallest = lst[0]
    min_index = 0
    for i in range(1,len(lst)):
        if lst[i] < smallest:
            smallest = lst[i]
            min_index = i
    return min_index

def selection_sort(lst):
    for i in range(len(lst)):
    	# j 是对于原list最小数的index
        j = find_min_index(lst[i:]) + i
		# swap the elements at i and j
        lst[i], lst[j] = lst[j], lst[i]
    return lst

3. 归并排序

我其他文章中有详细解释这段代码

图3 归并排序(图片引用来自:https://cuijiahua.com/blog/2018/01/algorithm_7.html)
def merge(lst1, lst2):
    res = []
    n1, n2 = len(lst1), len(lst2)
    i, j = 0, 0
    while i < n1 and j < n2:
        if lst1[i] <= lst2[j]:
            res += [lst1[i]]
            i += 1
        else:
            res += [lst2[j]]
            j += 1
    return res + lst1[i:] + lst2[j:]
    
def mergesort(ls):
    if len(ls) <= 1:
        return ls
    else:
        sub1 = mergesort(ls[:len(ls)//2])
        sub2 = mergesort(ls[len(ls)//2:])
        return merge(sub1, sub2)

4. 快速排序

没找到很好解释的动态图,简单来说就是找一个基准点(随机设),基准点左边的就是小于基准点的数,右边就是大于基准点的数,这个数就是check完加上去就行,无需考虑顺序。然后再在左右两边部分各找基准点再划分,直到所有数都为基准点的时候,就排好序了

# use iteration to quick sort
def quick_sort(lst):
    # if only 1 element in lst, return directly
    if len(lst) < 2:
        return lst
    # choose mid-term as pivot
    mid = lst[len(lst) // 2]
    # define left&right part of pivot
    left, right = [], []
    # remove mid-term
    lst.remove(mid)
    for item in lst:
        if item >= mid:
            right.append(item)
        else:
            left.append(item)
    # important: use iteration
    return quick_sort(left) + [mid] + quick_sort(right)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值