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

题目描述

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值