leetcode快排相关

leetcode:75颜色分类(3way)、215数组中的第K个最大元素(normal)

3way

private static void quick3waySort(int[] arr, int left, int hi) {
    if (lo >= hi) return; // 注意大于等于

    int mid = left + (right - left) / 2;
    swap(arr, lo, mid);

    int val = arr[lo];
    // lt表示等于val的,lt-1才是小于val的位置
    // gt表示还没比较的位置,但gt+1就是大于val的
    int lt = lo, gt = hi;
    int i = lo + 1;
    while (i <= gt) {
        if (arr[i] < val) swap(arr, lt++, i++); // nums[i] == 0 颜色分类
        else if (arr[i] > val) swap(arr, i, gt--); // nums[p] == 2 颜色分类
        else i++;
    }

    quick3waySort(arr, lo, lt - 1);
    quick3waySort(arr, gt + 1, hi);
}

normal

注意这里用for循环!!!

public int findKthLargest(int[] nums, int k) {
    // 左右指针,调整k
    int left = 0, right = nums.length - 1, n = nums.length - k, rank = 0;
    // 遍历,下面写法与二分查找十分相像
    while (right >= left){
        // 比较partition结果调整指针
        rank = partition(nums, left, right);
        if (rank < n){
            left = rank + 1;
        } else if (rank > n){
            right = rank - 1;
        } else {
            break;
        }
    }
    return nums[rank];
}

// partition函数
private int partition(int[] nums, int left, int right){
    // 设置mid,保存mid值pivot,lt指针
    int mid = left + (right - left) / 2, val = nums[mid], lt = left;
    // 交换mid与right
    swap(nums, mid, right);
    // 遍历
    for (int i = left; i < right; i++){
        // 如果小于pivot,就掉到前面,lt++    
        if (nums[i] < val){
            swap(nums, lt, i);
            lt++;
        }
    }
    
    // 交换pivot和lt
    swap(nums, lt, right);
    // 返回lt
    return lt;
}
原文地址:https://www.cnblogs.com/code2one/p/10177011.html