算法第二天

堆排序

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

 

posted @ 2021-01-26 23:59  guoguo514  阅读(83)  评论(0)    收藏  举报