剑指Offer------最小的k个数

来源:互联网 发布:c语言心形图案代码下载 编辑:程序博客网 时间:2024/06/03 21:57

题目描述

输入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);}}


原创粉丝点击