选择问题

来源:互联网 发布:知豆电动汽车官方网站 编辑:程序博客网 时间:2024/06/06 01:38

选择问题

一、含义

当有一组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;    }}
0 0
原创粉丝点击