📜  从整数列表中打印 N 个最小元素的程序(1)

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

从整数列表中打印 N 个最小元素的程序

当我们需要从一个整数列表中找出最小的N个元素时,我们可以用不同的算法来解决这个问题。以下是两个常见的算法:

堆排序

堆排序是一种高效的排序算法,它的时间复杂度为O(nlogn)。我们可以通过创建一个小根堆来找到整数列表中的N个最小元素。具体实现方法如下:

import heapq

def find_N_smallest_heap(arr, N):
    heap = arr[:N]
    heapq.heapify(heap)

    for num in arr[N:]:
        if num < heap[0]:
            heapq.heapreplace(heap, num)

    return heap

上述代码中,我们首先将整数列表中前N个元素构建一个小根堆。然后我们遍历整数列表,如果遍历到的元素比小根堆的堆顶元素小,则将它替换堆顶元素,从而保证堆中仍然是N个最小元素。最后我们返回小根堆即可。

快速选择

另一个常见的算法是快速选择,它的时间复杂度为O(n)。这种算法基于快速排序算法,我们可以通过选择一个枢纽元素(pivot),将整数列表分成小于和大于pivot的两部分。然后我们可以根据pivot在整数列表中的位置来决定我们只对哪一部分进行递归操作。

from random import randint

def find_N_smallest_quickselect(arr, N):
    def partition(arr, left, right):
        pivot_index = randint(left, right)
        pivot = arr[pivot_index]

        arr[right], arr[pivot_index] = arr[pivot_index], arr[right]
        store_index = left

        for i in range(left, right):
            if arr[i] < pivot:
                arr[store_index], arr[i] = arr[i], arr[store_index]
                store_index += 1

        arr[right], arr[store_index] = arr[store_index], arr[right]

        return store_index

    left = 0
    right = len(arr) - 1

    while True:
        pivot_index = partition(arr, left, right)

        if pivot_index == N:
            return arr[:N]

        elif pivot_index < N:
            left = pivot_index + 1

        else:
            right = pivot_index - 1

上述代码中,我们首先选择一个随机的pivot元素,并将其与整数列表的最后一个元素交换位置。然后我们将整数列表分成小于和大于pivot的两部分。我们只对其中一个部分递归操作,直到找到N个最小元素。

无论选择哪种算法,我们都可以通过简单的调用来找到整数列表中的N个最小元素。

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

print(find_N_smallest_heap(arr, 3))
# 输出 [1, 1, 2]

print(find_N_smallest_quickselect(arr, 3))
# 输出 [1, 1, 2]

以上就是如何从整数列表中打印N个最小元素的程序。我们可以根据具体情况选择适合自己的算法。