// 用查找排序,只找出k个从小到大排序的值的下标
public class Test {
// 找到前k个最小值 a[]
public static void main(String[] args) {
int k = 5; // 0 1 2 3 4 5 6 7 8 9 10 11
int[] array = {12,89,64,52,98,36,2,40,1,88,32,1};
Test sorter = new Test();
sorter.sort(array, k);
}
public void sort(int[] array,int k) {
int[] a = new int[k];
int[] numbers = new int[array.length];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = i;
}
for (int i = 0; i < k; i++) {
// 没有进行排序的)不断地与第i个相比,找到剩余中最小的,放在第i个
int index = i;
// find the minimum in the rest
for (int j = i; j < array.length; j++) {
if (array[index] > array[j]) {
index = j; // 不断把找出的最小值的下标 赋值给index
}
}
a[i] = array[index]; // 最小值
// change 得到正确下标数据的关键是,在交换的时候要把下标也换了
int temp = array[i];
array[i] = array[index];
array[index] = temp;
int temp2 = numbers[i];
numbers[i] = numbers[index];
numbers[index] = temp2;
}
int[] num_k = new int[k];
System.arraycopy(numbers, 0, num_k, 0, k);
for (int m : array) {
System.out.print(" " + m);
}
System.out.println("\n输出k个由小到大排列的值");
for (int i : a) {
System.out.print(" "+ i);
}
System.out.println("\n输出前k个是正确排列值的下标");
for (int ii : num_k) {
System.out.print(" "+ ii);
}
}
}
输出:
1 1 2 12 32 36 64 40 52 88 98 89
输出k个由小到大排列的值
1 1 2 12 32
输出前k个是正确排列值的下标
8 11 6 0 10
这里设置了k = 5,即在输出的第一行中,只有前五个是经过严格排序的(外层循环为5次,即只查找了5次最大值)。