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)

 

posted @ 2019-03-29 10:03  绯叶阿卡丽  阅读(397)  评论(0编辑  收藏  举报