您的位置:首页 > 理论基础 > 数据结构算法

算法与数据结构面试题(5)-查找最小的k 个元素

2014-12-11 10:35 351 查看

题目

输入n 个整数,输出其中最小的k 个。

例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。

理解

1.其实之前看线性查找算法的时候就一直有一个疑问,像这种查找第K个最小数或者K个最小的数,为什么要用线性查找算法这么难以理解的算法,难道随便用一个排序算法后,再遍历获得第K个小的数或者K个最小的数不好么?

2.既然这一题没有时间上的要求,那就试试看行不行,用快速排序试试。

快速排序

代码

public class Problem5 {
public int[] sort(int[] datas) {
if (datas.length == 0 || datas.length == 1)
return datas;

List<Integer> left = new ArrayList<Integer>();
List<Integer> right = new ArrayList<Integer>();
int pivot = datas[0];
for (int i = 1; i < datas.length; i++) {
if (datas[i] <= pivot) {
left.add(datas[i]);
} else {
right.add(datas[i]);
}
}
int[] sorted = new int[datas.length];
int[] leftArray = new int[left.size()];
for (int i = 0; i < left.size(); i++) {
leftArray[i] = left.get(i);
}
leftArray = sort(leftArray);
int[] rightArray = new int[right.size()];
for (int i = 0; i < right.size(); i++) {
rightArray[i] = right.get(i);
}
rightArray = sort(rightArray);
int index = 0;
for (int i = 0; i < leftArray.length; i++) {
sorted[index++] = leftArray[i];
}
sorted[index++] = pivot;
for (int i = 0; i < rightArray.length; i++) {
sorted[index++] = rightArray[i];
}
return sorted;
}

public static void main(String[] args) {
int[] datas = { 4, 1, 2, 56, 24, 5, 6, 97, 8, 0, 4 };
int[] sorted = new Problem5().sort(datas);
print(sorted, sorted.length);
// 求k个最小的数
int k = 4;
print(sorted, k);

}

public static void print(int[] datas, int length) {
for (int i = 0; i < length; i++) {
System.out.print(datas[i] + " ");
}
System.out.println("");
}
}

输出

0 1 2 4 4 5 6 8 24 56 97
0 1 2 4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: