TopK问题 Java代码

来源:互联网 发布:分销商城 php源码 编辑:程序博客网 时间:2024/05/13 01:47
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;}}}}}


0 0
原创粉丝点击