美文网首页
使用快排求第K大数值

使用快排求第K大数值

作者: C调路过 | 来源:发表于2020-03-13 15:42 被阅读0次
// note: 使用异或交互数值,需判断两数不相等
public class FindKthNum {

    public static void main(String[] args) {

        int[] arrs = new int[]{3, 2, 3, 1, 2, 4, 5, 5, 6};

        int t = new FindKthNum().findKthLargest(arrs, 4);
        System.out.print(t);
    }

    public int findKthLargest(int[] nums, int k) {
        return QuickSort(nums, 0, nums.length - 1, nums.length - k);
    }

    private int QuickSort(int[] arr, int first, int last, int target) {

        if (first > last) {
            return -1;
        }
        int p = paritition(arr, first, last);
        if (p == target) {
            return arr[p];
        }

        // 快排剪枝用于查找第K大的数,只需在其中一半进行查找
        int t = -1;
        if (target > p) {
            t = QuickSort(arr, p + 1, last, target);
        } else if (target < p) {
            t = QuickSort(arr, first, p - 1, target);
        }

        return t;
    }

    private int paritition(int[] arr, int first, int last) {
        // 随机化快排,优化?
        int idx = (int) (Math.random() * (last - first) + first);
        if (idx != first) {
            arr[idx] = arr[idx] ^ arr[first];
            arr[first] = arr[idx] ^ arr[first];
            arr[idx] = arr[idx] ^ arr[first];
        }
        int p = arr[first];
        int left = first + 1;
        int right = last;

        for (int i = left; i <= right; i++) {
            if (arr[i] >= p) {
                while (left <= right) {
                    if (arr[right] < p) {
                        arr[left] = arr[left] ^ arr[right];
                        arr[right] = arr[left] ^ arr[right];
                        arr[left] = arr[left] ^ arr[right];
                        left++;
                        right--;
                        break;
                    }
                    right--;
                }
            } else {
                left++;
            }
        }

        left--;
        if (p != arr[left]) {
            arr[first] = arr[left] ^ arr[first];
            arr[left] = arr[left] ^ arr[first];
            arr[first] = arr[left] ^ arr[first];
        }
        return left;
    }
}

相关文章

  • 使用快排求第K大数值

  • 查找算法之-从无序数中查找第k小数

    以求第k小数为例子(求第k大数原理一样)方法一:使用快排思想:一次排序后基准值左侧都是小于基准值的,基准值右侧都是...

  • TopK问题(快排变形/优先级队列)

    1.数组中第k大/前k大的元素(215-中) 示例: 思路: 法1:快排变形:类似传统快排,区别在于,我们每次进行...

  • 数组

    第K大的数 第K大的数1.快排:每次返回的是标准的index,当index=k-1时就返回,不是就遍历一边2.堆排...

  • Lua 快速排序

    快排 在一个数组中快速找出第K大的数

  • 5.第K大元素

    描述在数组中找到第k大的元素。给出数组 [9,3,2,4,8],第三大的元素是 4。 Solution使用快排Pa...

  • 06-20:刷题综合三:快排

    快排: 1、快速排序 2、快速排序寻找第K个大 3、最小的K个数 1、手写快排算法 class Solution:...

  • 算法

    查找:二分查找 排序 快排基于快排思想解决的问题partition,第k大的数字 归并 几种排序算法的时间复杂度,...

  • 快排 & 堆排序

    排序 排序一直是很基础的一个问题。 复习快排 &堆排序。 LeetCode215 找第k大的元素 快排 注意事项:...

  • 数组中第K大的数

    一、相关概念 二、题目 题目 一个未排序的数组中找第k大的数 思路 快排 代码 参考文献 数组中的第K个最大元素

网友评论

      本文标题:使用快排求第K大数值

      本文链接:https://www.haomeiwen.com/subject/rwylshtx.html