快速排序-无序数组K小元素

Posted hyserendipity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序-无序数组K小元素相关的知识,希望对你有一定的参考价值。

2020-03-10 11:16:13

问题描述:

找到一个无序数组中第K小的数

样例 1:

输入: [3, 4, 1, 2, 5], k = 3 
输出: 3

样例 2:

输入: [1, 1, 1], k = 2 
输出: 1

挑战

O(nlogn)的算法固然可行, 但如果你能 O(n) 解决, 那就非常棒了.

问题求解:

使用快速排序可以在O(n)的时间复杂度求解。

时间复杂度: O(n + n / 2 + n / 4 + ... + 1) = O(2 * n)

    public int kthSmallest(int k, int[] nums) {
        int n = nums.length;
        int idx = helper(nums, 0, n - 1);
        while (idx != k - 1) {
            if (idx > k - 1) idx = helper(nums, 0, idx - 1);
            else idx = helper(nums, idx + 1, n - 1);
        }
        return nums[idx];
    }
    
    private int helper(int[] nums, int start, int end) {
        int key = nums[start];
        int i = start;
        for (int j = start + 1; j <= end; j++) {
            if (nums[j] <= key) {
                int temp = nums[i + 1];
                nums[i + 1] = nums[j];
                nums[j] = temp;
                i += 1;
            }
        }
        nums[start] = nums[i];
        nums[i] = key;
        return i;
    }

  

 

以上是关于快速排序-无序数组K小元素的主要内容,如果未能解决你的问题,请参考以下文章

漫画:寻找无序数组的第k大元素

最强解析面试题:在无序数组中取最大的K个数「建议收藏!」

查找无序数组中第K大的数

快速排序算法及其思想的应用(寻找一个序列中第k小元素)

基于快速排序方法改成求第k大的数

最强解析面试题:在无序数组中取最大的K个数「建议收藏!」