Quick Select 快速选择算法

关于我的 Leetcode 题目解答,代码前往 Github:https://github.com/chenxiangcyr/leetcode-answers


快速选择是一种从无序列表找到第k小元素的选择算法。它从原理上来说与快速排序有关。同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间复杂度则不理想。
快速选择及其变种是实际应用中最常使用的高效选择算法。

快速选择的总体思路与快速排序一致,选择一个元素作为基准来对元素进行分区,将小于和大于基准的元素分在基准左边和右边的两个区域。不同的是,快速选择并不递归访问双边,而是只递归进入一边的元素中继续寻找。这降低了平均时间复杂度,从O(n log n)至O(n),不过最坏情况仍然是O(n2)。

示例:
从数组中找出第 k 小的元素:

// find the kth **smallest** element in an unsorted array
public int quickSelect(int[] nums, int k) {
    int i = 0;
    int j = nums.length - 1;
    
    while(i <= j) {
        int partitionIdx = partition(nums, i, j);
        
        if((k - 1) == partitionIdx) {
            return nums[partitionIdx];
        }
        else if((k - 1) < partitionIdx) {
            j = partitionIdx - 1;
        }
        else {
            i = partitionIdx + 1;
        }
    }
    
    return 0;
}

// same as qucik sort
public int partition(int[] nums, int start, int end) {
    if(start == end) {
        return start;
    }
    
    int pivot = nums[start];
    
    while(start < end) {
        // find first smaller element from right
        while(start < end && nums[end] >= pivot) {
            end--;
        }
        nums[start] = nums[end];
        
        // find first larger element from left
        while(start < end && nums[start] <= pivot) {
            start++;
        }
        nums[end] = nums[start];
    }
    
    nums[start] = pivot;
                         
    return start;
}

引用:


快速选择

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,105评论 0 15
  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,931评论 0 0
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,606评论 0 52
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 6,815评论 0 35
  • 朱元章的一生結束,他開啓一個王國,一心為子孫建立完美體制,而不明白,世間沒有完美,朱標的死也終於引發朱棣的野心,也...
    萌貓咪阅读 1,378评论 0 0

友情链接更多精彩内容