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