TopK問題——找出100萬個數中的前K個最大的

大體思路是:

  1. 首先將100萬條數據分割,這裏演示的分割爲100份
  2. 將這一百份中的數據進行快速排序
  3. 將一百分排序好的數據找出最大的組成一個長度爲100的新數組
  4. 對新數組進行快速排序
  5. 找出前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();
    }
}

 

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