无序数组求第k大的数 python_整数无序数组求第K大数
import java.util.Scanner;
/**
* 類似與求第k小的問題
* 求第k大相當于求第n-k+1小,n為數組長度
*
* 著名的BFPRT算法可保證在線性時間內得到結果。
* https://blog.csdn.net/qq_32767041/article/details/86099117
*
* 這里使用快速選擇算法,這是一種基于快速排序的算法,
* 在實現上比BFPRT更簡單。
* https://blog.csdn.net/qq_32767041/article/details/86300744
*
* @author wylu
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String[] strs = scanner.nextLine().split(" ");
int[] arr = new int[strs.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.valueOf(strs[i]);
}
int k = scanner.nextInt();
System.out.println(arr[quickSelect(arr, arr.length - k + 1)]);
}
}
/**
* 查找第k小元素
* @param arr 無序數組
* @param k 目標第k小
* @return 成功:返回第k小元素的索引
*? ? ? ? ?失敗:返回-1
*/
public static int quickSelect(int[] arr, int k) {
int left = 0, right = arr.length - 1, idx;
while (left <= right) {
idx = partition(arr, left, right);
if ((k - 1) == idx) return idx;
else if ((k - 1) > idx) left = idx + 1;
else right = idx - 1;
}
return -1;
}
/**
* 對給定的數組區間進行劃分
* @param arr 數組
* @param left 區間下限,包含arr[left]
* @param right 區間上限,包含arr[right]
* @return 返回劃分后,劃分基準的索引
*/
private static int partition(int[] arr, int left, int right) {
int j = left - 1;
for (int i = left; i < right; i++) {
if (arr[i] <= arr[right]) swap(arr, i, ++j);
}
swap(arr, ++j, right);
return j;
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
總結
以上是生活随笔為你收集整理的无序数组求第k大的数 python_整数无序数组求第K大数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吸水间最低动水位标高_消防水泵-吸水管路
- 下一篇: websocket python爬虫_p