编程之美-2.5寻找最大的K个数

package code.beauty.fungame;

import java.util.ArrayList;
import java.util.List;

public class FindMaxK {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[] = {33,3,17,5,7,1,33,43,88,23,12,33,67};
		int b[] = {33,3,17,5,7,1,33,43,88,23,12,33,67};
		int k=3;
//		quikSort(a,0,a.length-1);
		
		//smergeSort(a, 0, a.length-1);
		sortMaxK(b, k);
		for(int i =0 ; i<b.length; i++){
			System.out.print("b["+i+"]="+b[i]+"; ");
		}
		System.out.println();
		List<Long> p = new ArrayList<Long>();
		quikFindK(a, 0, a.length-1, k, p);
		for (Long long1 : p) {
			
			System.out.print("p[]="+long1+"; ");

		}
	}
	
	private static void quikFindK(int a[], int low , int high, int k,List<Long> p ){
		int mid;
		if(low<high){
			mid = Partition(a, low, high);
			int s=high-mid;
			if(s==k){
				for(int i=1;i<=k;i++) p.add((long) a[mid+i]);
				
			}else if(s>k){
				quikFindK(a, mid+1, high, k, p);
			}else if(s<k){
				for(int i=1;i<=s;i++) p.add((long) a[mid+i]);
				k=k-s;
				quikFindK(a, low, mid, k, p);
			}
		}
	}
	private static void sortMaxK(int a[], int k ){
		int i=0,j=0,m=a.length;
		int tmp;
		for(i = 0;i<k; i++){
			for(j=0; j<m-i-1; j++){
				if(a[j]>a[j+1]){
					tmp = a[j]; a[j] = a[j+1];a[j+1] = tmp;
				}
			}
		}
	}
	
	
	private static void merge(int a[], int low , int high,int mid){
//		int mid = (low+high)/2;
		int temp[] =new int[a.length];
		int i = low, j=mid+1,p=low;
		while(i<=mid&&j<=high){
			if(a[i]>a[j]){
				temp[p++]=a[j++];
			}else{
				temp[p++]=a[i++];
			}
			
		}
		if(i<=mid){
			for(;i<=mid;i++){
				temp[p++]=a[i];
			}
		}
		if(j<=high){
			for(;j<=high;j++){
				temp[p++]=a[j];
			}
		}
		for(int k=low ; k<=high;k++){
			a[k]=temp[k];
		}
//		while()
	}
	
	private static void mergeSort(int a[], int low , int high){
		if(low<high){
			int mid = (low+high)/2;
			mergeSort(a, low, mid);
			mergeSort(a, mid+1, high);
			merge(a,low,high,mid);
		}
				
		
	}
	
	
	
	
	
	private static int Partition(int a[], int low , int high){
		int prov=a[low];
		while(low<high){
			while(prov<=a[high]&&low<high){
				high--;
			}
			if(low<high){
				a[low++]=a[high];
			}
			while(prov>a[low]&&low<high){
				low++;
			}
			if(low<high){
				a[high--]=a[low];
			}
		}
		a[low]=prov;
		return low;
	}
	
	private static void quikSort(int a[], int low , int high){
		if(low<high){
			for(int i =0 ; i<a.length; i++){
				System.out.print("a["+i+"]="+a[i]+"; ");
			}
			System.out.println(" ");
			int mid = Partition(a, low , high);
			quikSort(a, low , mid-1);
			quikSort(a, mid+1 , high);
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值