剑指offer-第五章优化时间和空间效率(最小的k个数)

题目:输入n个数,输出最小的k个数。

时间复杂度为O(n)

思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition。但是只要找到前K个最小的元素,并不一定要排好序。

Java代码:

import java.util.Random;

//时间复杂度为O(n);
public class PreKOfArray {
	//一趟快速排序
     public int partition(int[] a,int start,int end){
    	 if(a==null)
    		 return -1;
    	 Random rand=new Random();
         int index=start+rand.nextInt(end-start);
         swrap(a,index,end);
         int small=start-1;
         for(index=start;index<a.length;index++){
        	 if(a[index]<a[end]){
        		 small++;
        		 if(small!=index)
        			 swrap(a,index,small);
        	 }
        	 
         }
         small++;
         swrap(a,small,end);
         return small;
     }

	public  void swrap(int[] a, int index, int end) {
		int temp=a[index];
		a[index]=a[end];
		a[end]=temp;
	}
	public void printMinKOfArray(int[] input,int[] output,int k){
		if(input==null||output==null||k>input.length||k<=0)
			return;
		int start=0;
		int end=input.length-1;
		int index=partition(input,start,end);
		//找到前k个最小的数字
		while(index!=k-1){
			if(index>k-1){
				end=index-1;
				index=partition(input,start,end);
			}
			else{
				start=index+1;
				index=partition(input,start,end);
			}
		}
		
		for(int i=0;i<k;i++){
			output[i]=input[i];
		}
		
		for(int z:output)
			System.out.println(z+",");
			
	}
	public static void main(String[] args){
		int[] a={2,3,1,4,9,0,5,6,7,8};
		int k=5;
		int[] b=new int[k];
		PreKOfArray poa=new PreKOfArray();
		poa.printMinKOfArray(a, b, 5);
	}
}
原文地址:https://www.cnblogs.com/hupp/p/4750311.html