查找最小的k个数及其位置 java实现

// 用查找排序,只找出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次最大值)。

猜你喜欢

转载自blog.csdn.net/weixin_42280517/article/details/82120537
今日推荐