📌  相关文章
📜  在数组中查找第K个最小元素以进行多个查询(1)

📅  最后修改于: 2023-12-03 15:37:43.144000             🧑  作者: Mango

在数组中查找第K个最小元素以进行多个查询

当需要在数组中查找第K个最小元素并需要进行多次查询时,可以使用一些算法来优化查询效率。本文将介绍两种常见算法:快速选择算法和堆排序算法。

1. 快速选择算法

快速选择算法是快速排序算法的变种。与快速排序算法类似,快速选择算法的时间复杂度为O(nlogn),最坏情况下时间复杂度为O(n^2)。不同的是,快速选择算法每次排序时只需要对某一部分进行排序。

快速选择算法的核心是pivot(中轴),通过对数组进行排序,将比pivot小的元素放在左侧,将比pivot大的元素放在右侧,然后比较pivot所在的位置与K的大小关系,从而决定接下来操作的区间。

见下方实现代码:

def partition(nums, left, right):
    pivot = nums[right]
    i = left - 1
    
    for j in range(left, right):
        if nums[j] < pivot:
            i += 1
            nums[i], nums[j] = nums[j], nums[i]
            
    i += 1
    nums[i], nums[right] = nums[right], nums[i]
    return i

def kthSmallest(nums, left, right, k):
    while left <= right:
        p = partition(nums, left, right)
        if p == k - 1:
            return nums[p]
        elif p < k - 1:
            left = p + 1
        else:
            right = p - 1
    return -1
2. 堆排序算法

堆排序算法是一种基于堆实现的选择排序,时间复杂度为O(nlogn)。堆排序算法的思路是构建一个大根堆或小根堆,将数组中的元素全部加入到堆中,然后从堆中取出前K个元素即为所求。

见下方实现代码:

import heapq

def kthSmallest(nums, k):
    heap = []
    for num in nums:
        heapq.heappush(heap, num)
        
    for i in range(k):
        ans = heapq.heappop(heap)
        
    return ans

以上两种算法都可以很好地解决在数组中查找第K个最小元素以进行多个查询的问题。具体实现可以根据情况选择。