JS中的算法与数据结构之常见排序(Sort)算法详解

JS中的算法与数据结构之常见排序(Sort)算法详解

本文将介绍JS中的算法与数据结构之常见排序(Sort)算法详解,包括排序算法的分类、原理、时间复杂度、代码实现和示例说明等。

1. 排序算法的分类

排序算法可以分为以下几类:

  • 冒泡排序(Bubble Sort)
  • 选择排序(Selection Sort)
  • 插入排序(Insertion Sort)
  • 希尔排序(Shell Sort)
  • 归并排序(Merge Sort)
  • 快速排序(Quick Sort)
  • 堆排序(Heap Sort)
  • 计数排序(Counting Sort)
  • 桶排序(Bucket Sort)
  • 基数排序(Radix Sort)

2. 排序算法的原理和时间复杂度

以下是常见排序算法的原理和时间复杂度:

排序算法 原理 时间复杂度
冒泡排序 依次比较相邻的两个元素,将较大的元素交换到后面 O(n^2)
选择排序 从未排序的元素中选择最小的元素,放到已排序的末尾 O(n^2)
插入排序 将未排序的元素插入到已排序的合适位置 O(n^2)
希尔排序 将数组分成若干个子序列,对每个子序列进行插入排序,最后对整个数组进行插入排序 O(nlogn)
归并排序 将数组分成两个子数组,对每个子数组进行排序,然后将两个子数组合并成一个有序数组 O(nlogn)
快速排序 选择一个基准元素,将数组分成两个子数组,小于基准元素的放在左边,大于基准元素的放在右边,然后对左右两个子数组进行递归排序 O(nlogn)
堆排序 将数组构建成一个最大堆,然后将堆顶元素与最后一个元素交换,再将剩余元素重新构建成最大堆,重复此过程直到整个数组有序 O(nlogn)
计数排序 统计小于等于每个元素的个数,然后根据统计结果将元素放到正确的位置 O(n+k)
桶排序 将元素分到不同的桶中,对每个桶中的元素进行排序,然后将所有桶中的元素合并成一个有序数组 O(n)
基数排序 将元素按照位数切割成不同的数字,然后按照每个位数分别进行排序,最后合并成一个有序数组 O(nk)

3. 排序算法的代码实现

以下是常见排序算法的代码实现:

3.1 冒泡排序

function bubbleSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

3.2 选择排序

function selectionSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    let minIndex = i;
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }
    [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
  }
  return arr;
}

3.3 插入排序

function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let j = i - 1;
    let temp = arr[i];
    while (j >= 0 && arr[j] > temp) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = temp;
  }
  return arr;
}

3.4 希尔排序

function shellSort(arr) {
  let len = arr.length;
  for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
    for (let i = gap; i < len; i++) {
      let j = i;
      let temp = arr[i];
      while (j - gap >= 0 && arr[j - gap] > temp) {
        arr[j] = arr[j - gap];
        j -= gap;
      }
      arr[j] = temp;
    }
  }
  return arr;
}

3.5 归并排序

function mergeSort(arr) {
  if (arr.length < 2) {
    return arr;
  }
  let mid = Math.floor(arr.length / 2);
  let left = arr.slice(0, mid);
  let right = arr.slice(mid);
  return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
  let result = [];
  while (left.length && right.length) {
    if (left[0] <= right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  while (left.length) {
    result.push(left.shift());
  }
  while (right.length) {
    result.push(right.shift());
  }
  return result;
}

3.6 快速排序

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

3.7 堆排序

function heapSort(arr) {
  let len = arr.length;
  for (let i = Math.floor(len / 2) - 1; i >= 0; i--) {
    heapify(arr, len, i);
  }
  for (let i = len - 1; i > 0; i--) {
    [arr[0], arr[i]] = [arr[i], arr[0]];
    heapify(arr, i, 0);
  }
  return arr;
}

function heapify(arr, len, i) {
  let largest = i;
  let left = 2 * i + 1;
  let right = 2 * i + 2;
  if (left < len && arr[left] > arr[largest]) {
    largest = left;
  }
  if (right < len && arr[right] > arr[largest]) {
    largest = right;
  }
  if (largest !== i) {
    [arr[i], arr[largest]] = [arr[largest], arr[i]];
    heapify(arr, len, largest);
  }
}

4. 示例

以下是两个示例说明,展示排序算法的应用场景:

4.1 示例1:冒泡排序

小明有一个数组[3, 1, 4, 2, 5],他想将数组按照从小到大的顺序排序。他使用冒泡排序算法,将数组排序后得到[1, 2, 3, 4, 5]。

4.2 示例2:快速排序

小红有一个数组[5, 3, 7, 2, 8, 4, 1, 6],她想将数组按照从小到大的顺序排序。她使用快速排序算法,将数组排序后得到[1, 2, 3, 4, 5, 6, 7, 8]。

5. 结论

通过以上介绍和示例说明,可以看JS中的算法与数据结构之常见排序(Sort)算法详解。在选择排序算法时,需要根据数据规模和时间复杂度来选择,以满足自己的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS中的算法与数据结构之常见排序(Sort)算法详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Scala函数式编程专题–函数思想介绍

    Scala函数式编程专题–函数思想介绍 什么是函数式编程? 函数式编程是一种编程模式,它的核心思想是将程序看做是一系列纯函数的组合。纯函数是指输入相同,结果一定相同,没有副作用,不会改变程序状态。 函数式编程可以提高程序的可读性、可维护性和可扩展性,因为每个函数都是相互独立的,可以单独测试和修改。 Scala中的函数式编程 Scala是一门兼具面向对象编程…

    云计算 2023年5月18日
    00
  • openstack私有云布署实践【11.1 计算nova – compute节点配置(科兴环境)】

    这里我只使用kxcompute1节点配置为示例,其它节点的配置基本是一样的,只是声明的管理IP不同而已   计算节点 # yum install openstack-nova-compute sysfsutils   修改配置文件 vi /etc/nova/nova.conf   [DEFAULT] vcpu_pin_set = 4-31 resume_gu…

    云计算 2023年4月10日
    00
  • Linux云计算架构-Zabbix变量和模板使用

    文章目录 Linux云计算架构-Zabbix变量和模板使用 1. 为什么需要模板? 2. 设置变量 3. 创建含有变量的面板 Linux云计算架构-Zabbix变量和模板使用 1. 为什么需要模板? 原因如下:正常情况下,当配置某个面板时,需要设置群组和主机名,否则无法获取到对应主机的数据。假如有10台主机需要监控,就得重复配置10次。若有10个监控指标,就…

    云计算 2023年4月12日
    00
  • 编程语言榜单Java与Python并列第二!Julia下滑

    编程语言榜单Java与Python并列第二!Julia下滑 最新的编程语言榜单发布了!据统计,目前最流行的编程语言仍然是JavaScript。但是最引人注意的消息是,Java和Python已经并列跻身榜单第二名。与此同时,上一次排在第4位的R语言成功升至第3位,而上次排名第2位的Julia语言则开始下滑。 Java和Python并列第二 Java和Pytho…

    云计算 2023年5月18日
    00
  • 【问题排查篇】一次业务问题对 ES 的 cardinality 原理探究

    作者:京东科技 王长春 业务问题 小编工作中负责业务的一个服务端系统,使用了 Elasticsearch 服务做数据存储,业务运营人员反馈,用户在使用该产品时发现,用户后台统计的订单笔数和导出的订单笔数不一致! 交易订单笔数不对,出现差错订单了?这一听极为震撼!出现这样的问题,在金融科技公司里面是绝对不允许发生的,得马上定位问题并解决! 小编马上联系业务和相…

    云计算 2023年5月6日
    00
  • Django models filter筛选条件详解

    下面我会提供一个完整的“Django models filter筛选条件详解”的攻略。我们将分步骤介绍筛选条件以及如何使用Django的filter方法来查询模型。 简介 Django是Python Web应用程序的基本框架之一。 在Django中,模型是由Python类表示的,每个类映射到数据库表。 要从数据库中检索数据,请使用Django ORM提供的许…

    云计算 2023年5月18日
    00
  • 如何使用Python对NetCDF数据做空间相关分析

    下面我将为你详细讲解如何使用Python对NetCDF数据进行空间相关分析的完整攻略。这个过程主要包含以下几个步骤: 安装必要的Python库 进行空间相关分析的过程需要使用到一些Python库,其中最主要的就是NetCDF4和numpy。你可以通过pip安装这些库: pip install netCDF4 numpy 打开NetCDF数据文件 首先需要打开…

    云计算 2023年5月18日
    00
  • 基于阿里云函数计算实现AI推理

    场景介绍 基于阿里云函数计算建立一个TensorFlow Serverless AI推理平台。。 背景知识 函数计算 Function Compute 是事件驱动的全托管计算服务。使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算为您准备好计算资源,弹性地可靠地运行任务,并提供日志查询、性能监控和报警等功能。函数计算帮助您无需管理服…

    2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部