针对问题

找到一对无序的数中第  K  大,或者第 K 小的元素,返回该元素的值或者它的 index(index 的情况比较适合这堆数每个都独一无二的情况,不然可能会有多个答案)。

关键思想

拿一个数做参照,其他数通过对比它,来左右放置,得到的结果肯定是这个数在该数组中的排列位置是正确的。(DIvide and Conquer 分治思想)

形象讲解

把所有数字当成一个个球,假设我们要选出第 K 小的那个球。

我们有两个筐:AB

首先我们随机选择一个球作为参照物,然后我们开始分捡这一堆球:比它小的进入 A 筐,大于等于它的进入 B 筐。

然后我们数一下 A 筐中有几个球。

如果刚好有 K-1 个,那么我们的参照物小球就是我们想要的那个第 K 个小球,不用忙活了,直接返回参照球;

如果小于 K-1 个,那么我们要的小球明显在 B 筐里面;我们排除掉 A 筐里面的 a 个球,则我们需要的是 B 筐中第 K-a 小的球,把筐清空,重新选择参照球,按上面流程再来一遍;

如果大于 K-1 个,那么我们要的小球明显在 A 筐里面;我们排除掉 B 筐里面的 b 个球,则我们需要的是 A 筐中第 K 小的球,把筐清空,重新选择参照球,按上面流程再来一遍。

实际与概念的区别

实际写代码的时候的操作,跟上面图解还是有些区别的。

上面的图解是为了简单粗暴快速将关键的概念融会贯通,而实际代码中,因为我们操作的是数组,而且为了防止递归迭代过程中无限循环,所以做了一些改进:

1. 不需要两个筐,在原数组上,选择最后一个元素作为参照数,浏览整个数组(除了参照数),然后在原数组上直接交换元素位置;

2. 直接操作数组的  start_index  和  end_index  就好,无需操作  k  ;

3. 递归迭代过程,与二分搜索的思路相似,为了防止出现递归下一层的数的数量与上一层相同,导致无限循环的情况,我们在下一层递归中,会将参照数拿走(即不会把参照小球放入 B 筐)。

JavaScript 代码

function quickSelect(nums, start, end, k){ //注意:k 是 zero-based 的,从零开始计数,而不是从一开始
if(start > end) return;
let pivot = nums[end];
let left = start;
for(let i=start; i<end; i++){
if(nums[i] < pivot){ //根据实际需要用 > 或 <
[nums[i], nums[left]] = [nums[left], nums[i]];
left++;
}
}
[nums[left], nums[end]] = [nums[end], nums[left]]; if(left === k) return pivot;
if(left < k) return quickSelect(nums, left+1, end, k);
return quickSelect(nums, start, left-1, k);
}

相关概念

pivot:轴,从无序数组中随机选取一个数字,或者取它的 first element 或 last element。

做题链接

LeetCode 215. Kth Largest Element in an Array

【算法】Quick Select的更多相关文章

  1. Quick Select算法

    https://blog.csdn.net/Yaokai_AssultMaster/article/details/68878950 https://blog.csdn.net/mrbcy/artic ...

  2. 算法 quick sort

    // ------------------------------------------------------------------------------------------------- ...

  3. 快速排序算法 quick sort的理解

    最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来, ...

  4. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  5. Union-Find(并查集): Quick union算法

    Quick union算法 Quick union: Java implementation Quick union 性能分析 在最坏的情况下,quick-union的find root操作cost( ...

  6. Union-Find(并查集): Quick find算法

    解决dynamic connectivity的一种算法:Quick find Quick find--Data sturcture 如果两个objects是相连的,则它们有相同的array value ...

  7. GitHub标星2.6万!Python算法新手入门大全

    今天推荐一个Python学习的干货. 几个印度小哥,在GitHub上建了一个各种Python算法的新手入门大全,现在标星已经超过2.6万.这个项目主要包括两部分内容:一是各种算法的基本原理讲解,二是各 ...

  8. 《算法导论》— Chapter 9 中位数和顺序统计学

    序 在算法导论的第二部分主要探讨了排序和顺序统计学,第六章~第八章讨论了堆排序.快速排序以及三种线性排序算法.该部分的最后一个章节,将讨论顺序统计方面的知识. 在一个由n个元素组成的集合中,第i个顺序 ...

  9. http://www.html5tricks.com/demo/jiaoben2255/index.html 排序算法jquery演示源代码

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or ...

随机推荐

  1. DE2之7-segment displays

    以前课题用的是友晶的DE2-70,现在重拾FPGA,选了一款性价比高的DE2.恰逢闲来无事,于是尝试将各个Verilog模块翻译成VHDL,半算回顾以前的知识,半算练习VHDL. Verilog 01 ...

  2. redis 主从复制 redis 探索

    http://blog.csdn.net/column/details/12804.html

  3. 图像局部显著性—点特征(SiftGPU)

    SIFT的计算复杂度较高. SiftGpu的主页:SiftGPU: A GPU Implementation of ScaleInvariant Feature Transform (SIFT) 对S ...

  4. 【sqli-labs】 less27a GET- Blind based -All you Union&Select Belong to us -Double Quotes(GET型基于盲注的去除了Union和Select的双引号注入)

    和less 27一样,单引号换双引号 http://192.168.136.128/sqli-labs-master/Less-27a/?id=0"%a0uNion%a0sElect%a01 ...

  5. html formData 数据 提交和 .netMVC接收

    <form id="uploadForm" enctype="multipart/form-data"> <input type=" ...

  6. PAT_A1110#Complete Binary Tree

    Source: PAT A1110 Complete Binary Tree (25 分) Description: Given a tree, you are supposed to tell if ...

  7. switch 语句的反汇编浅析

    switch 的简单情景(case 不超过 3 项) 首先,我们分析一下 switch 语句的一种简单情景,我们可以用 C 写出如下如下代码. 编译后用 OllyDBG 载入,它将显示出如下的反汇编代 ...

  8. 一张图搞懂javascript原型链

    js高级里面原型链对于新手来说并不友好,总的来说就是 任何函数都有自己的原型对象(prototype),任何实例对象都__proto__指向构造函数的原型 先来个最简单的原型三角关系 var fn = ...

  9. grunt入门 出处:http://artwl.cnblogs.com

    grunt-contrib-uglify uglify是一个文件压缩插件,项目地址:https://github.com/gruntjs/grunt-contrib-uglify 本文将以一个DEMO ...

  10. namespace、struct、enum、union、string(day01)

    一 C++概述 C++历史背景 )C++的江湖地位 jave C C++ C# python )C++之父:Bjarne Stroustrup(--) ,Cpre,为C语言增加类的机制 ,Bjarne ...