java实现输入n个整数,找出其中最小的K个数

来源:互联网 发布:卖家如何申请淘宝达人 编辑:程序博客网 时间:2024/06/03 19:07
package Nowcode;import java.util.ArrayList;/** * 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 *  * @author Administrator * */public class GetLeastNumbers {// 解决一:o(n)的算法:只有当我们可以修改输入的数组时可用public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {ArrayList<Integer> list = new ArrayList<Integer>();int length = input.length;int start = 0;int end = length - 1;if (input == null || k > length || k <= 0)return list;else {// 基于快速排序的分割方法int index = Partition(input, length, start, end);// 这样调整以后,位于数组中左边的k个数字就是最小的k个数字(这k个数字不一定排序)while (index != k - 1) {// 如果比k大,在左边调整if (index > k - 1) {end = index - 1;index = Partition(input, length, start, end);} else {// 如果比k小,调整右边start = index + 1;index = Partition(input, length, start, end);}}for (int i = 0; i < k; i++) {list.add(input[i]);}return list;}}// 在数组中选择一个数,比选择的数字小的数字移到数组的左边,比选择数字大的移动到数组的右边static int Partition(int[] data, int length, int start, int end) {if (data.length == 0 || length <= 0 || start < 0 || end >= length) {return -1;}// 选择从最后一个数为基准元素开始一次排序int index = start - 1;for (int i = start; i < end; ++i) {if (data[i] < data[end]) // 以最后一个元素为基准点进行划分{++index;if (index != i) {// 交换int temp = data[i];data[i] = data[index];data[index] = temp;}}}++index;// 交换int temp = data[index];data[index] = data[end];data[end] = temp;// System.out.print("index=" + index + " ");return index; // 返回一次排序后开始选择的数此刻所在最终位置索引}public static void main(String[] args) {int[] input = { 4, 5, 1, 6, 2, 7, 3, 8 };int k = 2;GetLeastNumbers g = new GetLeastNumbers();ArrayList<Integer> list = g.GetLeastNumbers_Solution(input, k);if (list != null) {for (int i = 0; i < list.size(); i++)System.out.print(list.get(i) + " ");} else {System.out.print(" ");}}}

原创粉丝点击