尋找最大的K個數優化解法一

 昨天咱們說了尋找最大的K個數常規的兩種解法,一種使用快速排序,另一種是部分排序。今天咱們介紹一種優化解法,
思想以下:在數組arr中咱們進行一趟快速排序,選定key,把數組分爲兩部分a1,和a2。a1中的元素大於等於key,a2中的元素小於key。這樣的話就會有兩種可能,第一:a1中的元素個數小於K,因此a1中的元素加上K-a1.length個元素就是數組arr中最大的K個數。第二:a1中的元素個數大於或等於K,則返回a1中最大的K個數。這樣不斷遞歸就能夠決絕這個問題。
先說說,一次快速排序。咱們須要返回兩個數組a1,a2,可是java不支持多參返回,因此咱們用二維數組作爲返回參數。具體代碼以下: //           
public static int[][] getArr(int[] arr) {
        if (arr == null || arr.length == 0) {
            return null;
        }
        int[][] newArr = new int[2][];
        int key = arr[0];
        List<Integer> list1 = new ArrayList<Integer>(); //首先使用list存儲數據
        List<Integer> list2 = new ArrayList<Integer>();
        for (int i=1; i<arr.length; i++) {
            if (arr[i] >= key) {
                list1.add(arr[i]);
            } else {
                list2.add(arr[i]);
            }
        }
        if (list1.size() < list2.size()) { //是數據存儲更加均勻
            list1.add(key);
        } else {
            list2.add(key);
        }
        int[] a1 = new int[list1.size()];//建立新的數組
        for (int i=0; i<list1.size(); i++) {//數組賦值
            a1[i] = list1.get(i);
        }
        int[] a2 = new int[list2.size()];
        for (int i=0; i<list2.size(); i++) {
            a2[i] = list2.get(i);
        }
        newArr[0] = a1;//儲存大於等於key的元素
        newArr[1] = a2;//存儲小於key的元素
        return newArr;
    }
接下來咱們就要遞歸調用了,代碼以下,咱們在外部聲明一個list用來存儲符合的數據,聲明以下:
static List<Integer> list = new ArrayList<Integer>();
public static void xunzhao(int[] arr, int k) {
        if (arr == null || arr.length == 0 || k < 0) {
            return;
        }
        if (arr.length <= k) {//數據比K小
            for (int i=0; i<arr.length; i++) {
                list.add(arr[i]); //存儲數據
            }
            return;
        }
        int[][] newArr = getArr(arr);
        if (newArr[0].length >= k) { //a1的元素個數大於K,
             xunzhao(newArr[0], k); //繼續分解
        } else {
            for (int i=0; i<newArr[0].length; i++) {
                list.add(newArr[0][i]); //存儲元素
            }
            xunzhao(newArr[1], k-newArr[0].length); //在a2中獲取K-a1.length個元素
        }
    }
原帖和源碼下載地址java

相關文章
相關標籤/搜索