选择问题
一、含义
当有一组N个数需要确定其中第k个最大者,这样的问题可看成为选择问题。
二、求解算法
1、解法一:首先将这N个数先读入一个数组中,再通过某种算法(如冒泡排序法等)以递增顺序将数组排序,最后返回位置k上的元素。
下面实现的核心代码
public class GetKValuesTest1 {
public static void main(String[] args) {
int[] nums = {1 ,3, 5, 0, 9, 2, 9};
System.out.println("getKValues = " + getKValues(nums, 5));
}
private static int getKValues(int[] nums, int k) {
if (nums == null || nums.length <= 0) {
throw new RuntimeException("数组无数据");
}
if (k < 1 || k >= nums.length) {
throw new RuntimeException("k值无效");
}
return bubblingSort(nums)[k - 1];
}
private static int[] bubblingSort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int temp;
if (nums[i] > nums[j]) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
return nums;
}
}
2、解法二:先把前k个元素读入数组并(以递增的顺序)对其排序。接着,将剩下的元素再逐个读入。当新元素读入时,如果它小于数组中的第k个元素则忽略之,否则就将其放到数组中的正确位置上,同时将数组中的一个元素挤出数组。当算法终止时,位于第k个位置上的元素作为答案返回。
public class GetKValuesTest2 {
public static void main(String[] args) {
int[] nums = {1 ,3, 5, 0, 9, 2, 9, 7, 12, 4, 6};
System.out.println("getKValues = " + getKValues(nums, 5));
}
private static int getKValues(int[] nums, int k) {
if (nums == null || nums.length <= 0) {
throw new RuntimeException("数组无数据");
}
if (k < 1 || k >= nums.length) {
throw new RuntimeException("k值无效");
}
int[] numsk = new int[k];
for (int i = 0; i < k; i++) {
numsk[i] = nums[i];
}
numsk = bubblingSort(numsk);
for (int i = k; i < nums.length; i++) {
if (nums[i] < numsk[k-1]) {
numsk = compareNum(numsk, nums[i]);
}
}
return numsk[k-1];
}
private static int[] bubblingSort(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
int temp;
if (nums[i] > nums[j]) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
return nums;
}
private static int[] compareNum(int[] nums, int num) {
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] <= num && nums[i+1] >= num) {
for (int j = nums.length - 1; j > i + 1; j--) {
nums[j] = nums[j - 1];
}
nums[i + 1] = num;
return nums;
}
}
return null;
}
}