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日

相关文章

  • 告别“停车难”!云计算助力智慧停车发展

    城市经济的繁荣,让跑在马路上的车辆越来越多。根据公安部统计的数据显示,截至2018年底,全国汽车保有量达到了2.4亿辆。然而,在汽车数量增长的同时,城市内各类停车场地并未进行有效整合,难以实现资源的合理配置。   国家发改委的数据显示:国内的停车位缺口达到了约5000万个,停车位短缺已成为当前城市发展急需解决的难题,车主对停车需求的迫切性也让智慧停车成为一个…

    云计算 2023年4月13日
    00
  • 如何利用js给自己照相并修图

    如何利用js给自己照相并修图 在Web开发中,我们可以使用JavaScript来实现照相和修图的功能。本文将提供一个完整攻略,包括如何使用JavaScript来照相和修图,并提供两个示例说明。 步骤1:使用WebRTC API照相 WebRTC API是一个浏览器原生的API,可以访问摄像头和麦克风。以下是使用WebRTC API照相的步骤: 在HTML文件…

    云计算 2023年5月16日
    00
  • 微软智能云布局高端服务,全面升级云计算竞争

    在微软新一季财报中,微软智能云Azure收入增长140%,其中高端服务收入比去年同期增长近3倍。自2015年以来,微软正在发力高端云服务市场,全面升级云计算竞争。 在微软新一季财报中,微软智能云Azure收入增长140%,其中高端服务收入比去年同期增长近3倍。自2015年以来,微软正在发力高端云服务市场,全面升级云计算竞争。 根据标准普尔Capital IQ…

    云计算 2023年4月13日
    00
  • C#中#define后面只加一个参数的解释

    下面是关于“C#中#define后面只加一个参数的解释”的完整攻略,包含两个示例说明。 简介 在C#中,我们可以使用#define指令来定义编译时常量。当我们在代码中使用了#define指令后,编译器会将指定的常量替换为对应的值。在本攻略中,我们将介绍在C#中使用#define后面只加一个参数的解释,包括如何定义和使用编译时常量。 步骤 在C#中使用#def…

    云计算 2023年5月16日
    00
  • 博文新书《云计算应用架构》即将上市

    内容简介 本书内容主要分为4个部分:第1章,简单介绍了云计算的概念及其价值;第2章,全面介绍了Amazon云服务;第3章,介绍进云之前该做怎样的准备工作;第4章到第7章,深入讨论在云中构建应用程序的各种细节问题。本书内容来自作者的亲身实践和感受,与坐而论道、形而上学的清谈不同,书中内容对实践有很强的参考意义,可以直接作为行动的指南。阅读本书后,云计算将不再是…

    云计算 2023年4月13日
    00
  • 云计算实训-day04

    终于等到你,属于我的路由器????在这里呢,当时还有点不太懂这个路由和路由表的含义,准确来说是不理解所以可以参考这篇博客,通过一个实例来理解路由和路由表: 理解路由表.本博客作为自己的笔记备份使用,不得转载(虽然也没有人会看见,哈哈哈哈哈哈哈)????

    2023年4月13日
    00
  • 《开源云计算:部署、应用、运维》学习笔记

    开源云计算:部署、应用、运维 王薇薇,康楠,张雪松,等 基础篇 2023-02-06 20:31 云计算的基本原理是:通过使计算分布在大量的分布式计算机上,而非本地计算机或特定的远程服务器中,使企业数据中心的运行与互联网具有更高的耦合度,使企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。这是一种革命性的变革,它意味着计算能力也可以作为一种商品…

    云计算 2023年5月4日
    00
  • Swagger2匹配多个controller代码实例

    下面是关于“Swagger2匹配多个controller代码实例”的完整攻略,包含两个示例说明。 简介 Swagger2是一个流行的API文档生成工具,它可以自动生成API文档,并提供交互式API测试功能。在使用Swagger2时,我们可能会遇到一个问题,即如何匹配多个controller。本攻略中,我们将介绍如何使用Swagger2来匹配多个control…

    云计算 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部