# 二分法查找 有序序列中的值 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)