算法思路:
排序法:排序后数组中第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);
}
}