如何找出数组中第K个最小的值

算法思路:

排序法:排序后数组中第K-1个位置上的数字

剪枝法:采用快速排序的思想

               1、选一个数tmp=a[n-1]作为枢纽,比它小的放左边比它大的放右边

               2、判断tmp的位置

                     2.1 如果它的位置是k-1,那么它就是第k个最小的值

                     2.2 如果它的位置小于k-1,说明第K个最小值在数组的右半部分,采用递归的方法在数组右半部分继续查找

                     2.3 如果它的位置大于k-1,说明第K个最小值在数组的左半部分,采用递归的方法在数组左半部分继续查找

代码实现:

package JBArray;

import java.util.IllegalFormatCodePointException;

/**
 * 找出数组中第K个最小的数
 * 方法1:
 *     排序法,排序后数组中第K-1个位置上的数字
 * 方法2:
 *     剪枝法:
 *     快速排序的思想
 * @author Dan
 *
 */
public class GetKMin {
	
	/**
	 * 快速排序找到枢纽值
	 * @param array
	 * @param low
	 * @param high
	 * @param k
	 * @return
	 */
	public static int quickSort(int[] array, int low, int high, int k){
		int i, j;
		int tmp;
		if(low>high){
			return Integer.MIN_VALUE;
		}
		i = low+1;
		j = high;
		tmp = array[i];
		while(i<j){
			while(i<j && array[j]>=tmp){
				j--;
			}
			if(i<j)
				array[i++] = array[j];//右边的数比tmp小,low与high交换数值,low下标递增
			while(i<j && array[i]<tmp){//判断low下标元素值与tmp的大小
				i++;
			}
			if(i<j)
				array[j--] = array[i];//左边的数比tmp大,low与high交换数值,high下标递减,接着循环比较high下标元素值与tmp的大小
		}
		array[i] = tmp;    //得到枢轴的位置
		if(i+1==k){        //枢轴的位置是k-1,tmp就是第K小的值
			return tmp;
		}
		else if(i+1>k){    //左边找
			return quickSort(array, low, i-1, k);
		}
		else{              //右边找
			return quickSort(array, i+1, high, k);
		}
	
	}
	/**
	 * 调用快排方法实现
	 * @param array
	 * @param k
	 * @return
	 */
	public static int getKMin(int[] array, int k){
		if(array ==null){
			return Integer.MIN_VALUE;
		}
		if (array.length<k) {
			return Integer.MIN_VALUE;
		}
		return quickSort(array, 0,array.length-1, k);
	}
	
	public static void main(String[] args) {
		int[] a = {1,5,2,6,8,0,6};
		int kMin = getKMin(a, 4);
		System.out.print(kMin);
	}
	
	
	
	

}

猜你喜欢

转载自blog.csdn.net/hd12370/article/details/81079690
今日推荐