剑指offer-30:最小的k个数

来源:互联网 发布:网络评书解放战争 编辑:程序博客网 时间:2024/04/29 14:25
package partation;import java.util.Scanner;/** * 输入n个整数,找出其中最小的k个数。 * 例如:输入4、5、1、6、2、7、3、8,最小的4个数字为1、2、3、4 * 基本思路:把输入的n个数排序,则排序后最前面的k个数就是最小的k个数。时间复杂度为O(nlogn) * 解法一:O(n)的算法,当可以修改输入的数组时候可用。分治法。 * Description: [类描述] * @author summ * @Version  * @Created at 2014-8-5 * @Modified by summ on 2014-8-5 */public class GetLeastNumbers {private static void getLeastNumbers(int[] input, int[] output, int i,int j, int k) {if (input == null || i > j) {return;}int pivot = partation(input , i, j);if (pivot != k-1) {if(pivot > k-1) {pivot = partation(input , i, pivot-1);} else {pivot = partation(input , pivot+1, j);}}for (int l = 0; l < output.length; l++) {output[l] = input[l];}}//分治法思想,将一个无序数组分成两个子序列,左边序列小于右边序列private static int partation(int[] array, int i, int j) {int low = i;int high = j;int temp = array[low];while(low < high) {while(temp <= array[high] && low < high) {high--;}array[low] = array[high];while(temp >= array[low] && low < high) {low++;}array[high] = array[low];}array[low] = temp;return low;}/** * @param args */public static void main(String[] args) {int k = 5;//输入函数Scanner sc = new Scanner(System.in);int[] input = new int[8];int[] output = new int[k];for (int i = 0; i < 8; i++) {input[i] = sc.nextInt();}//int[] input = {4,5,1,6,2,7,3,8};getLeastNumbers(input,output,0,input.length-1,k);for (int i = 0; i < output.length; i++) {System.out.print(output[i] + "  ");}}}

0 0
原创粉丝点击