Java找N個數中最小的K個數,PriorityQueue和Arrays.sort()兩種實現方法

最近看到了 java.util.PriorityQueue。剛看到還沒什麼感受,今天忽然發現他能夠用來找N個數中最小的K個數。html


假設有以下 10 個整數。java

5 2 0 1 4 8 6 9 7 3

怎麼找出最小的 5 個數呢?很好想到的方法是先升序排序,而後取 5 個就能夠。web

至於怎麼排序方法有不少,好比簡單的冒泡,選擇,」難點」的有快速,希爾和堆等等。api

先看看這種比較少見的實現方法的代碼,再看看下面的簡單介紹。oracle


PriorityQueue實現

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

public class FindSmallestKofNNumbers {

	public List<Integer> findSmallestKofNNumbers(	int[] numbers,
													int k) {

		Queue<Integer> queue = new PriorityQueue<>();
		for (int i : numbers) {
			queue.add(i);
		}

		List<Integer> ans = new ArrayList<>();
		for (int i = 0; i < k; ++i) {
			ans.add(queue.poll());// 取k個數加到列表中
		}

		return ans;
	}

}

看完沒,代碼簡單吧,核心代碼就幾句。建立一個 PriorityQueue 對象,調用 add 方法和 poll 方法。svg

  1. 建立一個 Integer 類型的一個基於優先級堆的無界優先級隊列。元素是按照隊列元素的天然順序進行排序。此隊列的是按指定方式肯定的最小的元素,若是多個元素都是最小值,則頭是其中一個元素——選擇方法任意。
  2. boolean add(E e) 將 e 插入此優先級隊列。
  3. E poll() 獲取並移除此隊列的頭,若是此隊列爲空,則返回 null

Arrays.sort()實現

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class FindSmallestKofNNumbers {

	public List<Integer> findSmallestKofNNumbers(	int[] numbers,
													int k) {

		int[] arr = Arrays.copyOf(numbers, numbers.length);
		Arrays.sort(arr);

		List<Integer> ans = new ArrayList<>();
		for (int i = 0; i < k; ++i) {
			ans.add(arr[i]);// 取k個數加到列表中
		}

		return ans;
	}

}

參考

[1] Class PriorityQueue<E>[OL].oracle,2019.spa

[2] 王一飛. PriorityQueue詳解[OL].簡書,2018.code

相關文章
相關標籤/搜索