如何使用JavaScript实现快速排序算法

简介: 如何使用JavaScript实现快速排序算法

快速排序是一种常见的排序算法,在实际应用中使用广泛。它的时间复杂度是O(nlogn),相对于其他排序算法,它的执行效率更高。

快速排序算法的核心是分治思想,它将一个数组分成两个子数组,然后递归地对子数组进行排序,最终将整个数组排好序。

下面是使用JavaScript实现快速排序算法的代码实现:


function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  const pivot = arr[Math.floor(arr.length / 2)];
  const left = [];
  const right = [];
  for (let i = 0; i < arr.length; i++) {
    if (i === Math.floor(arr.length / 2)) {
      continue;
    }
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}


上面的JavaScript代码实现了快速排序算法,首先判断传入的数组长度是否小于等于1,如果是,则直接返回该数组。否则,我们选择一个基准值(pivot)并将数组分成两个子数组,一个数组包含所有小于基准值的元素,另一个数组包含所有大于基准值的元素。然后,我们递归地对这两个子数组进行排序,并将它们与基准值合并起来。其中,我们使用了ES6的扩展语法来合并数组,如果你需要在旧版本的JavaScript中使用这个实现,你需要手动拼接数组。

除了使用中间元素作为基准值,还有其他选择基准值的方法,如随机选择、三数取中等。在实际应用中,根据具体情况选择不同的基准值选择方法可以提高算法的性能。此外,在实现过程中还可以使用其他优化策略,如尾递归优化、循环展开等,来提高算法的性能。 另外,在实现快速排序算法时,还有一些优化可以考虑。

  1. 第一个优化是针对基准值的选择。在前面的实现中,我们选择了数组中间的元素作为基准值。但是,如果数组已经有序,那么选择中间的元素作为基准值会导致快速排序算法的时间复杂度退化为O(n^2)。为了避免这种情况,可以采用三数取中(Median-of-three)的方法选择基准值。即在数组的开始、中间和结尾选取三个元素,然后选择其中值位于中间的元素作为基准值。
  2. 第二个优化是关于递归的实现方式。在前面的实现中,我们使用了递归来对子数组进行排序。但是,在递归深度过深的情况下,递归的开销可能会很大,甚至可能导致栈溢出。为了避免这种情况,可以使用迭代来替代递归,具体方法是使用一个栈(或队列)来存储待排序子数组的起始和结束下标,然后循环从栈(或队列)中取出一个子数组,对其进行排序,然后将左右子数组的起始和结束下标压入栈(或队列)中。

下面是使用JavaScript实现快速排序算法的优化代码实现:


function quickSort(arr) {
  const stack = [[0, arr.length - 1]];
  while (stack.length) {
    const [start, end] = stack.pop();
    if (end - start < 1) continue;
    const pivot = medianOfThree(arr, start, end);
    let left = start;
    let right = end;
    while (left <= right) {
      while (arr[left] < pivot) left++;
      while (arr[right] > pivot) right--;
      if (left <= right) {
        [arr[left], arr[right]] = [arr[right], arr[left]];
        left++;
        right--;
      }
    }
    stack.push([start, right]);
    stack.push([left, end]);
  }
  return arr;
}
function medianOfThree(arr, left, right) {
  const mid = left + Math.floor((right - left) / 2);
  if (arr[left] > arr[mid]) {
    [arr[left], arr[mid]] = [arr[mid], arr[left]];
  }
  if (arr[mid] > arr[right]) {
    [arr[mid], arr[right]] = [arr[right], arr[mid]];
    if (arr[left] > arr[mid]) {
      [arr[left], arr[mid]] = [arr[mid], arr[left]];
    }
  }
  return arr[mid];
}


在这个优化实现中,我们首先使用一个栈来存储待排序子数组的起始和结束下标。然后,每次从栈中取出一个子数组,使用三数取中的方法选择基准值,并使用双指针法进行排序。最后,将左右子数组的起始和结束下标


总结和思考


总结:


快速排序是一种高效的排序算法,它的时间复杂度为O(nlogn),相比其他排序算法,它更适用于大数据集的排序。

快速排序的核心思想是分治思想,它将一个数组分成两个子数组,递归地对子数组进行排序,最终将整个数组排序。

在实现快速排序算法时,需要注意基准值的选择,选择不同的基准值会影响算法的效率。同时,在递归实现时,需要注意边界条件和数组的合并方式。


思考:


快速排序算法的实现是相对简单的,但是它的效率却非常高。这是因为它使用了分治思想,将一个大问题分成两个小问题,然后递归地解决子问题。

另外,基准值的选择也很重要,一个好的基准值能够让算法的效率得到提高。通常情况下,选择数组中间的元素作为基准值是一个比较好的选择,但也有其他的选择方法,比如随机选择基准值或者选取三个元素取中间值等方法。

最后,快速排序算法虽然效率高,但也有一些缺点。当数据集较小时,快速排序算法的效率不如插入排序等简单排序算法。同时,在面对大量重复元素的情况下,快速排序算法的效率也会大打折扣。

因此,在实际应用中,需要根据具体情况选择不同的排序算法,并结合具体场景对算法进行优化。

目录
相关文章
|
2月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
62 4
|
2月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
128 61
|
3天前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
17 7
|
1天前
|
存储 监控 JavaScript
深度探秘:运用 Node.js 哈希表算法剖析员工工作时间玩游戏现象
在现代企业运营中,确保员工工作时间高效专注至关重要。为应对员工工作时间玩游戏的问题,本文聚焦Node.js环境下的哈希表算法,展示其如何通过快速查找和高效记录员工游戏行为,帮助企业精准监测与分析,遏制此类现象。哈希表以IP地址等为键,存储游戏网址、时长等信息,结合冲突处理与动态更新机制,确保数据完整性和时效性,助力企业管理层优化工作效率。
16 3
|
3月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
46 1
|
3月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
65 2
|
5月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
5月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
3月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
3月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
36 0