大體思路是:
- 首先將100萬條數據分割,這裏演示的分割爲100份
- 將這一百份中的數據進行快速排序
- 將一百分排序好的數據找出最大的組成一個長度爲100的新數組
- 對新數組進行快速排序
- 找出前K個最大的數病輸出
廢話不多說,下面是代碼,也可以通過碼雲進行下載點擊查看
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
/**
* TopK問題
* @author 胡海龍<[email protected]>
*/
public class QuicklySort{
public static void main(String[] args) {
//指定數組,這裏可以替換爲題目中的100萬數據
int[] arr = {19,18,17,6,5,4,3,2,1,7,8,11,9,10,13,12};
//將100萬數據分割爲100份,每份爲1萬,這裏是我的測試數據長度爲12,每份分6
int[][]arrays = splitArr(arr, 8);
//聲明一個大小爲分割份數的數組
int[]finallyArray = new int[arrays.length];
//對一百份數組進行快速排序
for(int i=0; i<arrays.length; i++){
sort(arrays[i],0,arrays[i].length-1);
printArr(arrays[i]);
int temp = arrays[i][arrays[i].length-1];
finallyArray[i] = temp;
}
//最終我們將自己聲明的數組進行快速排序即可
sort(finallyArray, 0, finallyArray.length-1);
//這時候我們需要找前K個最大的對應的進行找即可
Scanner sc = new Scanner(System.in);
System.out.print("plase input k value:");
int k = sc.nextInt();
sc.close();
//輸出前K位
for(int i=0; i<k; i++){
System.out.print(finallyArray[i]+" ");
}
}
//快速排序
public static void sort(int[]array,int low, int hight){
if(low>hight){
return;
}
int left = low;
int right = hight;
int pivot = array[low];
while(left<right){
while(array[right]>pivot && left<right){
right--;
}
while(array[left]<=pivot && left<right){
left++;
}
if(left<right){
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
array[low] = array[right];
array[right] = pivot;
sort(array, low, right-1);
sort(array, right+1, hight);
}
//分割數組
public static int[][] splitArr(int[]array,int subSize){
List<List<Integer>> list = new ArrayList<>();
int count = array.length%subSize == 0 ? array.length/subSize : array.length/subSize + 1;
for(int i=0; i<count; i++){
int index = i*subSize;
List<Integer> temp = new ArrayList<>();
int j = 0;
while(j<subSize && index<array.length){
temp.add(array[index++]);
j++;
}
list.add(temp);
}
int[][]newarray = new int[list.size()][];
for(int i=0; i<list.size(); i++){
List<Integer> subList = list.get(i);
int[]subArrItem = new int[subList.size()];
for(int j=0; j<subList.size(); j++){
subArrItem[j] = subList.get(j).intValue();
}
newarray[i] = subArrItem;
}
return newarray;
}
//打印數組
public static void printArr(int[]array){
for(int x : array){
System.out.print(x+" ");
}
System.out.println();
}
}