算法入门(1)

1 排序算法

1.1 直接选择法

依次赋序列中最小值

def SelectSort(src_list):
    """
    直接选择法:依次选择最小,放置于该位置
    Examples
    --------
    >>> LIST = [6, 1, 2, 4, 5, 7, 2]
    >>> SelectSort(LIST)
    [1, 2, 2, 4, 5, 6, 7]
    --------
    """
    obj_list = src_list
    for i in range(len(obj_list) - 1):
        index = i
        for j in range(i + 1, len(obj_list)):
            if obj_list[j] < obj_list[index]:
                index = j
        obj_list[i], obj_list[index] = obj_list[index], obj_list[i]
    return obj_list

1.2 冒泡法

两两比较, 把较大者推到上位

def BubbleSort(src_list):
    """
    冒泡
    两两比较 把较大者推到上位 O(n)~O(n2)
    >>> LIST = [1, 2, 4, 5, 7, 2]
    >>> BubbleSort(LIST)
    [1, 2, 2, 4, 5, 7]
    """
    for i in range(len(src_list) - 1):
        for j in range(len(src_list) - 1 - i):
            if src_list[j] > src_list[j + 1]:
                src_list[j], src_list[j + 1] = src_list[j + 1], src_list[j]
    return src_list

1.3 快排法

1.获取列表第一个元素位置index[base],使index[base]左侧 小于等于base,右侧大于等于base
2.分别对左右两子列表再分割
3.迭代

def QuickSort(src_list):
    """
    快排
    确定list[0]在list中index:  右序搜索小于base 赋给left
                              左序搜索大于base 赋给right
                              直至left=right,此时左序列全小,右序列全大
                              对左半division,对右半division,迭代直至left=right

    >>> LIST = [1, 2, 4, 5, 7, 2]
    >>> QuickSort(LIST)
    [1, 2, 2, 4, 5, 7]
    """

    def division(left, right):
        nonlocal src_list
        base = src_list[left]
        while right > left:
            while src_list[right] >= base and left < right:
                right -= 1
            src_list[left] = src_list[right]
            while src_list[left] <= base and left < right:
                left += 1
            src_list[right] = src_list[left]
        src_list[left] = base
        return left

    def qsort(left, right):
        nonlocal src_list
        if left < right:
            i = division(left, right)
            qsort(left, i - 1)
            qsort(i + 1, right)

    qsort(0, len(src_list) - 1)
    return src_list

1.4 直接插入排序

思想: 将无序数列依次取出,添加到有序数列中
(梳理手牌)

def InsertSort(src_list):
    """
    直接插入法:数列依次取出排序成有序数列,
    Examples
    --------
    >>> LIST = [6, 1, 2, 4, 5, 7, 2]
    >>> InsertSort(LIST)
    [1, 2, 2, 4, 5, 6, 7]
    --------
    """
    obj_list = src_list.copy()
    for i in range(1, len(obj_list)):
        temp = src_list[i]
        for j in range(i, -1, -1):
            if j >= 1 and obj_list[j-1] > temp:
                obj_list[j] = obj_list[j - 1]
            else:
                obj_list[j] = temp
                break

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值