js算法——快速排序与快速选择

简介: js算法——快速排序与快速选择

快速排序


创建用于交换数组两个值的函数swap

创建quick快速排序函数,入参i为起始下标,j为末尾下标

我们将起始下标i对应的arr[i]值作为基准,声明两个哨兵,l与r分别代表左侧哨兵和右侧哨兵,初始位于起始下标和末尾下标。

r向左侧移动,寻找到第一个小于(若降序则相反)基准的值;l向右侧移动,寻找到第一个大于(若降序则相反)基准的值,找到后交换,并继续找下一对值交换,寻找条件要确保左侧哨兵和右侧哨兵没有相遇:l<r。

当哨兵相遇时,将相遇点的值与基准值交换,得到的相遇点的值为基准中心,左侧的值一定小于它,右侧的一定大于它。

将相遇点左侧与右侧继续递归,递归条件为基准中心左侧l-1下标值大于起始下标i,也就是相遇点左侧至少存在两个数,右侧同理,递归完毕,值从小到大进行排序。

   //对应解释1
   const swap=(arr,a,b)=>{
       [arr[a],arr[b]]=[arr[b],arr[a]]
   }
   //对应解释2
   const quick=(arr,i,j)=>{
      //对应解释3
      let l=i,r=j
      //对应解释4
      while(l<r){
          while(l<r&&arr[r]>=arr[i]) r--
          while(l<r&&arr[l]<=arr[i]) l++
          swap(arr,l,r)
      }
      //对应解释5
      swap(arr,i,l)
      //对应解释6
      if(l-1>i){
        quick(arr,i,l-1)
      }
      if(l+1<j){
        quick(arr,l+1,j)
      }
   }
   quick(arr,0,arr.length-1)

快速选择


  1. 例如寻找前k个最小的数,快速排序时左侧值会小于基准中心,因此每次找到基准中心如果基准中心:
    若等于k则已经找到前k个最小值了,返回前k个即可;
    若大于k,则右侧数排除,继续排序左侧即可;
    若小于k,则左侧数已经在前k个最小值的范围内了,顺序无所谓,继续排序右
   const swap=(arr,a,b)=>{
       [arr[a],arr[b]]=[arr[b],arr[a]]
   }
   const quick=(arr,i,j)=>{
      let l=i,r=j
      while(l<r){
          while(l<r&&arr[r]>=arr[i]) r--
          while(l<r&&arr[l]<=arr[i]) l++
          swap(arr,l,r)
      }
      swap(arr,i,l)
      //对应解释
      if(l===k){
         return arr.slice(0,k)
      }else if(l>k){
         return quick(arr,i,l-1)
      }else {
         return quick(arr,l+1,j)
      }
   }
   const res= quick(arr,0,arr.length-1)

例如寻找第k个大的数,降序排序的话快速排序时左侧值会大于基准中心,因此每次找到基准中心如果基准中心:

若等于k-1则已经找到那个第k个(arr[k-1])大的数了,返回即可;

若大于k-1,则第k大的数必定在左侧,右侧数全排除,继续排序左侧即可;

若小于k-1,则左侧数(不超过k个)是都大于第k大的数,顺序无所谓直接排除,继续排序右侧。

   const swap=(arr,a,b)=>{
       [arr[a],arr[b]]=[arr[b],arr[a]]
   }
   const quick=(arr,i,j)=>{
      let l=i,r=j
      while(l<r){
          while(l<r&&arr[r]>=arr[i]) r--
          while(l<r&&arr[l]<=arr[i]) l++
          swap(arr,l,r)
      }
      swap(arr,i,l)
      //对应解释
      if(l===k-1){
         return arr[k-1]
      }else if(l>k-1){
         return quick(arr,i,l-1)
      }else {
         return quick(arr,l+1,j)
      }
   }
   const res= quick(arr,0,arr.length-1)
相关文章
|
10天前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
37 4
|
2月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
1月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
21 1
|
1月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
32 2
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
1月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
1月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
|
1月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
274 1