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

13:07:382020-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;
    }

  

 

posted @ 2020-03-10 11:23  hyserendipity  阅读(443)  评论(0编辑  收藏  举报