• 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)
  • 相关阅读:
    暑假每周学习进度-7
    暑假每周学习进度-6
    寒假生活05
    寒假生活04
    寒假生活03
    寒假生活02
    寒假生活01
    软件设计师2019模拟小测
    第二周学习记录
    2019秋季学习计划
  • 原文地址:https://www.cnblogs.com/x0216u/p/10619443.html
Copyright © 2020-2023  润新知