javascript实现快速排

yizhihongxing

javascript实现快速排

快速排序(Quick Sort)是一种常见的排序算法,其核心思想是通过分治的方式逐步缩小待排序的序列范围,从而实现排序。下面我们使用 JavaScript 实现一个快速排序算法。

算法思想

快速排序的算法过程如下:

  1. 选择一个基准元素,将它放在序列的正确位置上;
  2. 将序列分为左右两部分,其中左边部分的元素都小于基准元素,右边部分的元素都大于或等于基准元素;
  3. 递归地对左右两部分执行第 1 步和第 2 步,直到子序列的大小为 1 或 0。

实现过程

下面是使用 JavaScript 实现快排的代码:

function quickSort(array) {
  if (array.length <= 1) {
    return array;
  }

  const pivotIndex = Math.floor(array.length / 2);
  const pivot = array.splice(pivotIndex, 1)[0];
  const left = [];
  const right = [];

  for (let i = 0; i < array.length; i++) {
    if (array[i] < pivot) {
      left.push(array[i]);
    } else {
      right.push(array[i]);
    }
  }

  return quickSort(left).concat([pivot], quickSort(right));
}

实现过程分为三部分:

  1. 如果数组的长度小于等于 1,那么直接返回该数组,因为长度为 1 或 0 的数组已经是有序的了,无需排序。
  2. 选择一个基准元素 pivot(一般选择中间位置的数),并将其从数组中删除。
  3. 遍历整个数组,将小于 pivot 的元素放入左子数组 left 中,大于等于 pivot 的元素放入右子数组 right 中。然后递归地对左右子数组进行快排,最后将结果数组返回。

测试代码

下面是一个测试函数 quickSortTest,用于验证 quickSort 函数的正确性:

function quickSortTest() {
  const testCases = [
    { input: [], expected: [] },
    { input: [5], expected: [5] },
    { input: [3, 5, 1, 6, 4, 2], expected: [1, 2, 3, 4, 5, 6] },
    { input: [5, 4, 3, 2, 1], expected: [1, 2, 3, 4, 5] },
    { input: [1, 2, 3, 4, 5], expected: [1, 2, 3, 4, 5] },
    { input: [5, 5, 5, 5, 5], expected: [5, 5, 5, 5, 5] },
  ];

  testCases.forEach(({ input, expected }) => {
    const result = quickSort(input);
    console.assert(
      JSON.stringify(result) === JSON.stringify(expected),
      `Failed: input=[${input}], result=[${result}], expected=[${expected}]`
    );
  });

  console.log("All test cases pass");
}

总结

快速排序是一种高效的排序算法,它的时间复杂度为 O(n log n),空间复杂度为 O(log n)。我们使用 JavaScript 实现了快速排序算法,它不仅简单易懂,而且代码量很小,非常适合在实际项目中使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript实现快速排 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • R语言变量重编码、重命名的操作

    R语言变量重编码、重命名的操作攻略 在R语言中,变量重编码和重命名是常见的数据处理操作。本攻略将详细介绍如何进行这些操作,并提供两个示例说明。 变量重编码 变量重编码是将原始变量的取值映射到新的取值上,常用于将分类变量转换为数值变量或者将原始取值进行分组。以下是变量重编码的步骤: 创建一个映射表,将原始取值与新取值进行对应。可以使用ifelse()函数、ca…

    other 2023年8月8日
    00
  • WPS表格中实现分类快速求和的方法介绍

    WPS表格中实现分类快速求和的方法介绍 在WPS表格中,我们可以使用一些方法来实现分类快速求和。下面是一个详细的攻略,包含了两个示例说明。 方法一:使用数据透视表 首先,确保你的数据已经按照分类进行了排序,并且每个分类都在同一列中。 选中你的数据范围,包括分类列和求和列。 在菜单栏中选择“数据”选项卡,然后点击“数据透视表”按钮。 在弹出的对话框中,将选中的…

    other 2023年7月28日
    00
  • Win10开始菜单按钮右键点击没反应现象的解决办法

    Win10开始菜单按钮右键点击没反应现象,可能是由于系统文件损坏、驱动问题、第三方软件冲突等原因引起的。下面是针对这一问题的完整攻略: 检查并修复系统文件 在开始菜单中,搜索并选择“命令提示符(管理员)”。 在弹出的窗口中输入命令“sfc /scannow”(不含引号)并按下Enter键。 等待系统扫描和恢复损坏的文件。 示例说明: 假设用户在Win10系统…

    other 2023年6月27日
    00
  • React中state属性和生命周期的使用

    React中的state属性和生命周期是React开发中非常重要的概念,掌握它们的使用可以提高我们开发React应用的效率和质量。在这里,我将为大家详细讲解React中state属性和生命周期的使用,并且提供一些示例,来帮助大家更好地理解它们的使用。 React中state属性的使用 1. 什么是state? 在React中,每个组件都有自己的状态(stat…

    other 2023年6月27日
    00
  • VS常用快捷键(最全版本)

    VS常用快捷键完整攻略 快捷键介绍 Visual Studio是一款非常强大的集成开发环境(IDE),使用可大大提升我们的开发效率。下面列出VS中最常用的快捷键: 快捷键 描述 Ctrl + S 快速保存文件 Ctrl + Z 撤销上一次操作 Ctrl + Y 重做上一次被撤销的操作 Ctrl + F 查找 Ctrl + H 替换 Ctrl + Shift …

    其他 2023年4月16日
    00
  • RealProxy深入

    RealProxy深入 RealProxy是.NET框架提供的一个代理机制,它可以实现对类实例的透明代理访问,使得我们可以在不破坏原有类结构的情况下,为原有的类添加或修改行为,或者替换原有的类实例。 RealProxy概述 RealProxy的实现方式是通过C#中的继承来达到透明代理的目的,RealProxy继承了MarshalByRefObject这个.N…

    其他 2023年3月28日
    00
  • Linux防火墙iptables添加白名单方式

    Linux防火墙iptables是一种广泛使用的防火墙工具,它可以在网络层面上过滤和限制网络数据流量,确保系统和网络的安全。下面将介绍如何通过iptables添加白名单,以允许某些特定的IP地址或者端口可以访问服务器。具体步骤如下。 步骤一:查看iptables状态 首先,我们需要确保iptables已经启用。输入以下命令来查看: sudo iptables…

    other 2023年6月27日
    00
  • jQuery实现图片预加载效果

    下面是jQuery实现图片预加载效果的完整攻略: 准备工作 首先,需要在HTML文件中引入jQuery库。可以使用CDN方式引入,也可以将jQuery库下载至本地进行引用。具体操作方式如下: <!– CDN引入方式 –> <script src="https://cdn.bootcdn.net/ajax/libs/jquery…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部