T28:求最小的K个数(利用快排)

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,

利用快排:利用temp=a[0];然后从右到左找比temp小的数 ,从左往右寻找比temp大的数  指针l=0;指针r=a.length-1 直到l=r

         原始:4,5,1,6,2,7,3,8  temp=4  l=0;r=7;

      第一趟:3,5,1,6,2,7,3,8    r=6 l=0  右

     第二趟:   3,5,1,6,2,7,5,8  r=6;l=1  左

    第三趟:    3,2,1,6,2,7,5,8   r=4,l=1  右

      第四趟:  3,2,1,6,6,7,5,8   r=4,l=3 左

    第五趟:3,2,1,6,6,7,5,8    l=r=3   右

 最后令:a[l]=temp  即 3,2,1,4,6,7,5,8

public class GetLeastNumbers_Solution1 {
  public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
	  ArrayList<Integer> array=new ArrayList<Integer>();
	  if (input==null||input.length==0||input.length<k||k<=0) {
          return array;
      }
	 
	 int index=quickSort(input,0,input.length-1);
	 while(index!=k-1){
		 if(index<k-1){
			index= quickSort(input,index+1,input.length-1); 
		 }
		 if(index>k-1){
			 index= quickSort(input,0,index-1);
		 }
	 }
	 
	 for(int i=0;i<k;i++){
		 array.add(input[i]);
	 }
	  return array;
        
    }

   static int quickSort(int[] input, int l, int r) {
	int temp=input[l];
	while(l<r){
		while(l<r&&input[r]>=temp){
			r--;
		}
		input[l]=input[r];
		while(l<r&&input[l]<=temp){
			l++;
		}
		input[r]=input[l];
	}
	input[l]=temp;
	return l;
}

  public static void main(String[] args) {
	 int [] a={4,5,1,6,2,7,3,8};
	 ArrayList<Integer> array=new ArrayList<Integer>();
	    array=GetLeastNumbers_Solution(a,6);
	    for(int i=0;i<array.size();i++){
	    	System.out.print(a[i]+" ");
	    }
	 
}
}

猜你喜欢

转载自blog.csdn.net/qq_40516725/article/details/84852920
今日推荐