Java选择问题代码

来源:互联网 发布:服装设计知乎 编辑:程序博客网 时间:2024/06/01 08:57

选择问题是指,在某个无序集中选择第K个最大值的问题
比较初级的解决方案是:
先采用冒泡排序之类的算法,将无序集进行有序化,再从中取出第K大的值
例如:

    /**     * 从大到小的冒泡排序     * @param ints     * @return     */    public static void bubbleSort(int[] numbers){        for (int j = numbers.length; j > 0; j--) {            for (int i = 0; i < numbers.length-1; i++) {                if(numbers[i]<numbers[i+1]){                    int k = numbers[i];                    numbers[i] = numbers[i+1];                    numbers[i+1] = k;                }            }        }    }

由于计数习惯上的区别,第k个最大值实际上应该位于集length的第k-1位置上,故取出已有序化的集中第k-1位的元素,就是所要的元素.

此方法在算法效率上并不高,另一个相对比较好的算法是:
一:取该集的前k个元素另成一子集,对其进行排序
二:遍历父集中的剩余元素,与子集的第k位进行比较,若更大,则为其在子集中找到正确的位置,后面的元素顺序向后调整,末位挤出
三:遍历完成后,从子集中取出第k-1个元素,就是所要的元素
Java:

    /**     * 创建一个长度为k的微型数组,排序后遍历源数组,将源数组中比微型数组内元素大的元素置入正确位置,遍历完成后取出第k-1位的元素     * @param numbers     * @param k     * @return     */    public static int smallArraysSortSelection(int[] numbers, int k){        //创建一个微型数组,长度为k,并截取源数组中的第0到k-1位        int[] smallArrays = Arrays.copyOf(numbers, k);        //从源数组第k位开始遍历至数组末位        for (int i = k; i < numbers.length; i++) {            //如果数组中的元素比之微型数组的最后一位大,则为其在微型数组中找出位置,将末位元素挤出            if(numbers[i]>smallArrays[k-1]){                int index = k-1;                while(index > 0&&numbers[i]>=smallArrays[index]){                    index--;                }                for (int j = smallArrays.length-1; j > index; j--) {                    smallArrays[j] = smallArrays[j-1];                }                smallArrays[index] = numbers[i];            }        }        return smallArrays[k-1];    }
0 0
原创粉丝点击