1,二分查找
def bin_search(data_set, val): low = 0 high = len(data_set) - 1 while low <= high: mid = (low+high)//2 if data_set[mid]['id'] == val: return mid elif data_set[mid]['id'] < val: low = mid + 1 else: high = mid - 1 return ###有序列表查找 def binary_search(dataset, find_num): if len(dataset) > 1: mid = int(len(dataset) / 2) if dataset[mid] == find_num: #print("Find it") return dataset[mid] elif dataset[mid] > find_num: return binary_search(dataset[0:mid], find_num) else: return binary_search(dataset[mid + 1:], find_num) else: if dataset[0] == find_num: #print("Find it") return dataset[0] else: pass #####有序字典key查找
2排序
low逼三人组(冒泡,选择,插入)
冒泡排序
def bubble_sort(li):
for i in range(len(li) - 1): for j in range(len(li) - i - 1): if li[j] > li[j+1]: li[j], li[j+1] = li[j+1], li[j] ###冒泡排序
如状态,可以直接结束算法果冒泡排序中执行一趟而没有交换,则列表已经是有序
def bubble_sort_1(li): for i in range(len(li) - 1): exchange = False for j in range(len(li) - i - 1): if li[j] > li[j+1]: li[j], li[j+1] = li[j+1], li[j] exchange = True if not exchange: break
选择排序
一趟遍历记录最小的数,放到第一个位置; 再一趟遍历记录剩余列表中最小的数,继续放置; 问题是:怎么选出最小的数
def select_sort(li): for i in range(len(li) - 1): min_loc = i for j in range(i+1,len(li)): if li[j] < li[min_loc]: min_loc = j li[i], li[min_loc] = li[min_loc], li[i]
插入排序
def insert_sort(li): for i in range(1, len(li)): tmp = li[i] j = i - 1 while j >= 0 and li[j] > tmp: li[j+1]=li[j] j = j - 1 li[j + 1] = tmp
快速排序
def quick_sort_x(data, left, right): if left < right: mid = partition(data, left, right) quick_sort_x(data, left, mid - 1) quick_sort_x(data, mid + 1, right)
def partition(data, left, right): tmp = data[left] while left < right: while left < right and data[right] >= tmp: right -= 1 data[left] = data[right] while left < right and data[left] <= tmp: left += 1 data[right] = data[left] data[left] = tmp return left
3堆排序
二叉树是度不超过2的树 满二叉树与完全二叉树 (完全)二叉树可以用列表来存储,通过规律可以从父亲找到孩子或从孩子找到父亲
大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大 小根堆:一棵完全二叉树,满足任一节点都比其孩子节点小
1.建立堆 2.得到堆顶元素,为最大元素 3.去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。 4.堆顶元素为第二大元素。 5.重复步骤3,直到堆变空。 def sift(data, low, high): i = low j = 2 * i + 1 tmp = data[i] while j <= high: #只要没到子树的最后 if j < high and data[j] < data[j + 1]: j += 1 if tmp < data[j]:#如果领导不能干 data[i] = data[j] #小领导上位 i = j j = 2 * i + 1 else: break data[i] = tmp
数据结构