算法第二天
堆排序
def sift(li, low, high): """ :param li: :param low: 堆顶位置索引 :param high: 最后一个元素索引 :return: """ i = low j = 2 * i + 1 tmp = li[i] while j <= high: if j <= high and li[j] < li[j + 1]: j += 1 if tmp < li[j]: li[i] = li[j] i = j j = 2 * i + 1 else: li[i] = tmp break else: li[i] = tmp def heap_sort(li): n = len(li) for i in range(n // 2 - 1, -1, -1): sift(li, i, n - 1) for i in range(n - 1, -1, -1): li[0], li[1] = li[1], li[0] sift(li, 0, i - 1)
topk
def top_k(li, k): heap = li[0:k] for i in range(k // 2 - 1, -1, -1): sift(heap, i, k - 1) for i in range(k, len(li)): if li[i] > heap[0]: heap[0] = li[i] sift(heap, 0, k - 1) for i in range(k - 1, -1, -1): heap[0], heap[i] = heap[i], heap[0] sift(heap, 0, i - 1) return heap
归并排序
def merge(li, low, mid, high): i = low j = mid + 1 new_l = [] while i <= mid and j <= high: if li[i] < li[j]: new_l.append(li[i]) i += 1 else: new_l.append(li[j]) j += 1 while i <= mid: new_l.append(li[i]) i += 1 while j <= high: new_l.append(li[j]) j += 1 li[low:high + 1] = new_l return li def merge_sort(li, low, high): if low < high: mid = (low + high) // 2 merge_sort(li, low, mid) merge_sort(li, mid + 1, high) merge(li, low, mid, high) return li

浙公网安备 33010602011771号