javascript实现快速排

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日

相关文章

  • h3csnmp配置解析

    h3csnmp配置解析 简介 h3csnmp是华三公司推出的一款网路管理软件,用于网络运维人员对华三设备进行管理。在使用h3csnmp的过程中,需要对其进行相应的配置。本文将对h3csnmp进行配置解析,帮助网络运维人员更好地使用华三设备。 配置文件 h3csnmp的配置文件主要分为以下几个部分: SNMP服务配置 <snmpagent> &lt…

    其他 2023年3月28日
    00
  • MySQL数据库grant授权命令

    MySQL数据库grant授权命令 在MySQL数据库中,grant命令用于对数据库或表格进行授权操作,授权用户访问或修改数据库的权限,主要包括以下几个方面: 对哪个数据库或表格进行授权 授权谁(用户名) 给予何种权限 从哪个主机可以连接到MySQL服务器 下面我们将详细介绍MySQL数据库grant授权命令的使用方法。 grant授权命令语法格式 GRAN…

    其他 2023年3月28日
    00
  • Linux服务器基本应用

    Linux服务器基本应用攻略 1、常用操作系统及安装 常用的Linux操作系统有Ubuntu、CentOS、Debian、Red Hat等,其中CentOS是最常用的服务器操作系统之一。 安装CentOS的过程如下:1. 下载CentOS官方镜像,刻录至U盘等载体。2. 进入服务器BIOS设置,选择从U盘启动。3. 进入CentOS安装页面,按提示进行操作,…

    other 2023年6月27日
    00
  • 浅析BootStrap栅格系统

    浅析BootStrap栅格系统 什么是BootStrap栅格系统? BootStrap栅格系统是一种用于构建响应式网页布局的前端框架。它基于栅格系统的概念,将页面划分为12个等宽的列,通过在不同屏幕尺寸下的列的组合来实现灵活的布局。 栅格系统的基本原理 BootStrap栅格系统的基本原理是将页面划分为12个等宽的列,并通过CSS样式来控制每个列在不同屏幕尺…

    other 2023年7月28日
    00
  • jsdom(超级详细 如果对dom知识还不熟悉的必看)

    下面是关于“jsdom(超级详细如果对dom知识还不熟悉的必看)”的完整攻略: 1. 什么是jsdom? jsdom是一个基于Node.js的库,可以在Node环中模拟浏览器的DOM环境。它可以让开发者在Node.js环境中使用DOM API,例如document、window等,从而现在端操作DOM的功能。 2. 安装jsdom 在使用jsdom之前,需要…

    other 2023年5月7日
    00
  • centos7host文件

    以下是关于“CentOS 7 Hosts文件”的完整攻略: 步骤1:打开Hosts文件 在CentOS 7系统中,Hosts文件位于/etc/hosts路径。可以使用以下命令打开Hosts文件: sudo vi /etc/hosts“` 上面的命令将使用vi编辑器打开Host文件。 ## 步骤2:添加主机名和地址 在Hosts文件中,可以添加主机名和IP地…

    other 2023年5月7日
    00
  • Java子类对象的实例化过程分析

    Java子类对象的实例化过程分析 概述 在Java中,当我们创建一个子类对象时,其实会经历一系列的步骤。本文将通过分析Java子类对象的实例化过程,帮助读者更好地理解Java面向对象编程中一些重要的概念和机制。 具体步骤 Java子类对象的实例化过程包含以下几个步骤: 继承父类:子类继承了父类的所有属性和方法; 初始化父类属性:子类构造方法首先会调用父类的构…

    other 2023年6月26日
    00
  • C语言超详细文件操作基础上篇

    下面是“C语言超详细文件操作基础上篇”攻略的完整讲解。 文件指针 在进行文件操作之前,我们需要了解一个重要的概念——文件指针。文件指针类似于数组下标,它指向文件中的特定位置。C语言中定义了一个FILE结构体类型来表示文件,该结构体类型中有一个指向文件开头的文件指针,名为*fp,通常通过调用fopen()函数来获得。 文件打开与关闭 在进行文件操作之前,我们需…

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