TopK問題 Java代碼

import java.util.Arrays;

public class TopK{
	public static void main(String[] args){
		int [] data = {5,1,2,3,4,0,6,7,8,9};
		int k = 1;
		FindTopK(data, 0, data.length-1, k-1);
		System.out.println(Arrays.toString(data));
		System.out.println(data[k-1]);
	}
	
	public static void swap(int[] num, int i, int j ){
		int temp = num[i];
		num[i] = num[j];
		num[j] = temp;
	}
	
	public static int pertition(int[] num, int low, int high){
		int flag = num[low];
		int i = low;
		int j = high+1;
		while(i<j){
			while(++i<=high && num[i]>=flag);
			while(--j>=low && num[j]<=flag);
			if(i>=j)break;
			swap(num, i, j);
		}
		swap(num, low, i-1);
		return i-1;
	}
	
	public static void FindTopK(int[] num, int start, int end, int k){
		if(start>=end) return;
		int flag = pertition(num, start, end);
		if(flag == k){
			return;
		}
		else if(flag > k){
			FindTopK(num, start, flag-1,k);
		}else{
			FindTopK(num, flag+1, end, k+start-flag-1);
		}
	}
}


import java.util.Arrays;

public class TopKWithMinHeap {

	public static void main(String[] args) {
		int k = 3;
		int[] num = {0,9,8,7,6,1,2,3,4,5};
		BuildMinHeap(num, k-1);
		for(int loop = k; loop<num.length; loop++){
			if(num[loop] > num[0]){
				swap(num, 0, loop);
			}
			BuildMinHeap(num, k-1);
		}
		System.out.println(Arrays.toString(num));
		System.out.println(num[0]);
	}
	
	public static void swap(int[] num, int i, int j){
		int temp = num[i];
		num[i] = num[j];
		num[j] = temp;
	}
	
	public static void BuildMinHeap(int[] num, int index){
		int loop = (index - 1)/2;
		for(;loop>=0; loop--){
			int innerIndex = loop;
			while((innerIndex*2+1)<=index){
				int smallerIndex =  innerIndex*2+1;
				if((innerIndex*2+1)< index){
					if(num[innerIndex*2+1]<num[innerIndex*2+2]){
						smallerIndex++;
					}
				}
				if(num[innerIndex]>num[smallerIndex]){
					swap(num, innerIndex, smallerIndex);
					innerIndex = smallerIndex;
				}else{
					break;
				}
			}
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章