Python 常见排序查找算法-二分法,归并,冒泡,插入

# 二分法查找 有序序列中的值
def binary_search(sorted_seq, val):
    """复杂度 O(log(N))"""
    if not len(sorted_seq):
        return 'Not Find'
    low = 0
    high = len(sorted_seq) - 1

    while low <= high:
        mid = (high + low) // 2
        if sorted_seq[mid] == val:
            return mid
        elif sorted_seq[mid] > val:  # 说明 在 low - mid
            high = mid - 1
        else:  # 说明 在 mid - high
            low = mid + 1
    #  如果还存在特殊情况? val 不在其中的时候 比如 【1,3,4】 val=2
    if sorted_seq[low] == val:
        return low
    else:
        return 'Not Find'


# 冒泡排序
def bubble_sort(seq):
    """
    拿出一个数 和其余的数目依次比较 如果 发现大于其中的一个数 就立刻互换位置 复杂度 O(n^2)
    :param seq:
    :return:
    """
    n = len(seq)
    for i in range(n):
        for j in range(n-1):
            if seq[i] > seq[j]:
                seq[i], seq[j] = seq[j], seq[i]


# 插入排序
def insertion_sort(seq):
    """一次拿出一个数 到 已经排序的数组里面 按顺序插入"""
    n = len(seq)
    for i in range(1, n):
        cur_val = seq[i]
        cur_pos = i
        #  向左遍历查找 发现小于的就互换位置
        while cur_pos and cur_val < seq[cur_pos - 1]:
            seq[cur_pos] = seq[cur_pos - 1]
            cur_pos -= 1  # 继续向左偏移
        seq[cur_pos] = cur_val


# 归并排序
def merge_sort(seq):
    """ 分解元素 分别排序 最后合在一起  复杂度 O(nlogn)"""
    n = len(seq)
    if n < 2:
        return seq
    l_arr = seq[:n//2]
    r_arr = seq[n//2:]
    new_l_arr = merge_sort(l_arr)
    new_r_arr = merge_sort(r_arr)
    new_array = []
    while 1:
        if not len(new_l_arr):
            new_array += new_r_arr
            return new_array
        if not len(new_r_arr):
            new_array += new_l_arr
            return new_array
        if new_r_arr[0] < new_l_arr[0]:
            new_array.append(new_r_arr[0])
            new_r_arr.pop(0)
        else:
            new_array.append(new_l_arr[0])
            new_l_arr.pop(0)


if __name__ == '__main__':
    seq = [1,7,4,2,5,3,9,6,8]
    src = merge_sort(seq)
    print(src)

 

转载于:https://www.cnblogs.com/x0216u/p/10619443.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值