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

题目


输入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 


你可能感兴趣的:(数据结构,算法)