0:堆与堆排序:

# 构建大根堆:
def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1  # left = 2*i + 1
    r = 2 * i + 2  # right = 2*i + 2

    if l < n and arr[i] < arr[l]: # 根节点小于左节点
        largest = l # 左节点是最大结点

    if r < n and arr[largest] < arr[r]: # 右节点大于最大结点,则右节点是最大结点
        largest = r

    if largest != i: # 如果最大结点不是根节点
        arr[i], arr[largest] = arr[largest], arr[i]  # 交换根节点和最大结点
        heapify(arr, n, largest) # 调换完了,我看看换完了之后是不是还是大根堆。


def heapSort(arr):
    n = len(arr) # 堆长度
    for i in range(n - 1, -1, -1): # 从后向前递归创建大根堆
        heapify(arr, n, i)
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 交换
        heapify(arr, i, 0) # 调整大根堆

一:最小的K个数:

给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组

class Solution:
    # 构建大根堆:
    def heapify(self,arr, n, i):
        largest = i
        l = 2 * i + 1  # left = 2*i + 1
        r = 2 * i + 2  # right = 2*i + 2

        if l < n and arr[i] < arr[l]: # 根节点小于左节点
            largest = l # 左节点是最大结点

        if r < n and arr[largest] < arr[r]: # 右节点大于最大结点,则右节点是最大结点
            largest = r

        if largest != i: # 如果最大结点不是根节点
            arr[i], arr[largest] = arr[largest], arr[i]  # 交换根节点和最大结点
            self.heapify(arr, n, largest) # 调换完了,我看看换完了之后是不是还是大根堆。


    def heapSort(self,arr):
        n = len(arr) # 堆长度
        for i in range(n - 1, -1, -1): # 从后向前递归创建大根堆
            self.heapify(arr, n, i)
        for i in range(n - 1, 0, -1):
            arr[i], arr[0] = arr[0], arr[i]  # 交换
            self.heapify(arr, i, 0) # 调整大根堆
        
    def GetLeastNumbers_Solution(self, tinput, k):
        length = len(tinput)
        if k > length:
            return []
        else:
            self.heapSort(tinput)
            return tinput[:k]

二:寻找第K大:

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

class Solution:
        # 构建大根堆:
    def heapify(self,arr, n, i):
        largest = i
        l = 2 * i + 1  # left = 2*i + 1
        r = 2 * i + 2  # right = 2*i + 2

        if l < n and arr[i] < arr[l]: # 根节点小于左节点
            largest = l # 左节点是最大结点

        if r < n and arr[largest] < arr[r]: # 右节点大于最大结点,则右节点是最大结点
            largest = r

        if largest != i: # 如果最大结点不是根节点
            arr[i], arr[largest] = arr[largest], arr[i]  # 交换根节点和最大结点
            self.heapify(arr, n, largest) # 调换完了,我看看换完了之后是不是还是大根堆。


    def heapSort(self,arr):
        n = len(arr) # 堆长度
        for i in range(n - 1, -1, -1): # 从后向前递归创建大根堆
            self.heapify(arr, n, i)
        for i in range(n - 1, 0, -1):
            arr[i], arr[0] = arr[0], arr[i]  # 交换
            self.heapify(arr, i, 0) # 调整大根堆
        
    def findKth(self, a, n, K):
        if n < K:
            return []
        self.heapSort(a)
        return a[n-K]