题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
<分析>
这就是数组排序算法,但是考察的是时间复杂度
做了两种解法:1.冒泡排序,时间复杂度O(k*n)
2.快速排序,时间复杂度O(nlogn)
import java.util.ArrayList;
/**
*
* @author zy
* @date 2017年10月4日 下午11:08:35
* @Decription 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
*/
public class Ex19 {
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
/**
* 解法一:冒泡排序,时间复杂度O(k*n)
*/
// ArrayList<Integer> result = new ArrayList<>();
// if (k > input.length || k == 0) {
// return result;
// }
// for(int i = 0;i < k;i++){
// int tmp = 0;
// for (int j = input.length-1; j >i; j--) {
// if (input[j]<input[j-1]) {
// tmp = input[j];
// input[j] = input[j-1];
// input[j-1] = tmp;
// }
// }
// result.add(input[i]);
// }
//
// return result;
/**
* 解法二:快速排序
*/
ArrayList<Integer> result = new ArrayList<>();
if (k > input.length || k == 0) {
return result;
}
quickSort(input, 0, input.length-1);
for(int i = 0;i<k;i++){
result.add(input[i]);
}
return result;
}
void quickSort(int[] array,int low,int high){
if (low > high) {
return;
}
int i,j,index;
i = low ;
j = high;
index = array[i];//用子表的第一个记录做基准
while(i < j){//从子表两端交替向中间做扫描
while(i < j && array[j] >= index){
j--;
}
if (i < j) {
array[i++] = array[j];//用比基准小的记录替换地位记录
}
while(i < j && array[i] < index){
i++;
}
if (i < j) {
array[j--] = array[i];
}
}
array[i] = index;
quickSort(array, low, i-1);
quickSort(array, i+1, high);
}
}