算法与结构---选择问题

package 第一章;

public class 选择问题 {

/* 问题:设有一组N个数而要确定其中第K个最大者,我们称之为选择问题(selection problem) */

public static void main(String[] args) {

// 给定数组

int array[] = { 5491, 6897, 5892, 395, 3347, 2846, 2094, 5300, 7878, 3109 };

System.out.println(method1(array, 4));

// System.out.println(method2(array, 4));

}

/*

* 方法1: 将这N个数读入一个数组中,在通过某种简单算法,比如冒泡排序,异递减顺序将数组排序,然后返回 K上的元素

*/

public static int method1(int[] array, int k) {

// 排序后: 7878,6897,5892,5491,5300,3347,3109,2846,2094,395

sort(array);

return array[k - 1];

}

/*

* 方法2:将前K个元素读入数组(已递减顺序)对其进行排序.接着,将剩下的元素在逐个读入.当新元素被读取时,如果小于数组中的

* 第四个元素则忽略,否则就将其当道数组中正确的位置.同时将数组中的一个元素移除数组,终止时返回第K个元素

*/

public static int method2(int[] array, int k) {

// 排序后: 7878,6897,5892,5491,5300,3347,3109,2846,2094,395

// 存储K个元素的数组

int nArray[] = new int[k];

// 添加元素

for (int i = 0; i < k; i++) {

nArray[i] = array[i];

}

// 对数组排序

sort(nArray);

for (int i = k - 1; i < array.length; i++) {

// 如果当前元素没有最后一个大忽略

if (array[i] < nArray[k - 1]) {

continue;

}

// 创建一个存储K+1个元素的数组,用来放新的较大的值

int[] kArray = new int[k + 1];

// 给新数组赋值

for (int y = 0; y < nArray.length; y++) {

kArray[y] = nArray[y];

}

// 新数组最后一个元素为较大值

kArray[kArray.length - 1] = array[i];

// 对新数组排序

sort(kArray);

// 将新数组的前K个元素赋值给老数组

for (int x = 0; x < nArray.length; x++) {

nArray[x] = kArray[x];

}

}

return nArray[k - 1];

}

// 方法3在第二章中讲解

public static int method3(int array[], int k) {

return 0;

}

// 对数组进行排序

public static int[] sort(int[] array) {

for (int x = 0; x < array.length - 1; x++) {

for (int y = x + 1; y < array.length; y++) {

if (array[x] < array[y]) {

int item;

item = array[x];

array[x] = array[y];

array[y] = item;

}

}

}

return array;

}

}

你可能感兴趣的:(算法与结构---选择问题)