快排及前k小或第k大數通用求解

思路超級簡單的快速排序,手寫快排專用。

public int partition(int[] r, int i, int j) {
	int temp = r[i];
	while(i < j)
	{
	    while(i < j && r[j] > temp) {
	        j--;
	    }
	    if(i < j)
	        r[i++] = r[j];
	
	    while(i < j && r[i] <= temp) {
	        i++;
	    }
	    if(i < j)
	        r[j--] = r[i];
	}
	r[i] = temp;
	return i;
}
public void quickSort(int r[], int i, int j) {
	if(i < j) {
	    int cut = partition(r, i ,j);
	    quickSort(r, i, cut - 1);
	    quickSort(r, cut + 1, j);
	}
}

轉自https://www.jianshu.com/p/64c2444ae9ac
並附上快速求解第k大或者是前k個小的數,模版求解。

import java.util.ArrayList;

public class Test {


    public int partition(int[] r, int i, int j) {
        int temp = r[i];
        while(i < j)
        {
            while(i < j && r[j] > temp) {
                j--;
            }
            if(i < j)
                r[i++] = r[j];

            while(i < j && r[i] <= temp) {
                i++;
            }
            if(i < j)
                r[j--] = r[i];
        }
        r[i] = temp;
        return i;
    }

    boolean flag = false;

    //遞歸調用一趟排序
    public void quickSort(int r[], int i, int j, int k) {
        if(flag) {
            return;
        }
        if(i < j){
            int cut = partition(r, i, j);
            if(cut == k) {
                flag = true;
            }
            quickSort(r, i, cut - 1, k);
            quickSort(r, cut + 1 ,j, k);
        }
    }

    // 求解前k小的數
    public ArrayList<Integer> test1(int[] input, int k) {
        if(input.length == 0 || k > input.length) {
            return new ArrayList<>();
        }
        quickSort(input, 0, input.length - 1, k);
        ArrayList<Integer> list = new ArrayList<>(k);
        for(int i = 0; i < k; i++) {
            list.add(input[i]);
        }
        return list;
    }

    // 第k大
    public int test2(int[] input, int k) {
        quickSort(input, 0, input.length - 1, k);
        return input[k];
    }

    public static void main(String[] args) {
        Test test = new Test();
        // 求解前k小的數
        ArrayList<Integer> list = test.test1(new int[]{1, 3, 5, 9, 6, 2}, 4);
        list.forEach(System.out::println);
        System.out.println("------------");
        // 第k大的數
        int k = 4;
        int number = test.test2(new int[]{1, 3, 5, 9, 6, 2},  k - 1);
        System.out.println(number);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章