基于js 各种排序方法和sort方法的区别(详解)

针对“基于js 各种排序方法和sort方法的区别(详解)”这个话题,我将从以下几个方面进行详细讲解。

一、基础排序算法

在介绍各种排序算法之前,我们先了解一下几个基础排序算法:冒泡排序、插入排序和选择排序。

1. 冒泡排序

冒泡排序的基本思路是比较相邻的元素,如果前面的元素比后面的大,则交换这两个元素。每完成一轮比较,就可以确定一个最大的元素,并且这个最大的元素已经排好序了。时间复杂度为O(n^2)。

以下是冒泡排序的JavaScript代码实现:

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

2. 插入排序

插入排序的基本思路是将一个数组分成两个部分,一部分是已经排好序的,另一部分是待排序的。每次取出待排序部分的第一个元素,将它插入到已排序部分的正确位置。时间复杂度为O(n^2)。

以下是插入排序的JavaScript代码实现:

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

3. 选择排序

选择排序的基本思路是从待排序的数组中找到最小的元素,将它放到已排序数组的末尾。这样每次找到的最小元素都是未排序数组中最小的元素。时间复杂度为O(n^2)。

以下是选择排序的JavaScript代码实现:

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

二、高级排序算法

高级排序算法包括快速排序、归并排序和堆排序。这些算法的时间复杂度都是O(nlogn)。

1. 快速排序

快速排序的基本思路是选择一个元素作为“基准元素”,然后将数组中的其他元素分别与这个基准元素进行比较,将较小的元素排在基准元素的左边,将较大的元素排在基准元素的右边。然后对基准元素左右的子数组分别进行递归后,再对其进行合并。快速排序的关键在于选取合适的基准元素。时间复杂度为O(nlogn)。

以下是快速排序的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));
}

2. 归并排序

归并排序的基本思路是将数组分成两个部分,对这两个部分分别进行递归,直到每个部分只有一个元素。然后将这些只有一个元素的部分合并起来,并按照从小到大的顺序排列。时间复杂度为O(nlogn)。

以下是归并排序的JavaScript代码实现:

function mergeSort(array) {
  if (array.length <= 1) {
    return array;
  }
  const midIndex = Math.floor(array.length / 2);
  const left = array.slice(0, midIndex);
  const right = array.slice(midIndex);
  return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
  const result = [];
  let i = 0;
  let j = 0;
  while (i < left.length && j < right.length) {
    if (left[i] < right[j]) {
      result.push(left[i]);
      i++;
    } else {
      result.push(right[j]);
      j++;
    }
  }
  return result.concat(left.slice(i), right.slice(j));
}

3. 堆排序

堆排序的基本思路是利用堆这种数据结构进行排序。首先将数组转化为一个大根堆,然后将堆顶元素与数组末尾元素交换,接着再将前n-1个元素转化为大根堆,再交换堆顶元素与数组末尾元素。如此反复操作直到完成排序。时间复杂度为O(nlogn)。

以下是堆排序的JavaScript代码实现:

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

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

三、数组的Sort方法

JavaScript数组自带的sort方法可以进行升序排列和降序排列。如果没有指定比较函数,则按照字符串的unicode码进行排序。如果指定了比较函数,那么按照比较函数的规则进行排序。

以下是按照数字大小进行升序排列的JavaScript代码实现:

const array = [3, 1, 4, 2, 5];
array.sort(function(a, b) {
  return a - b;
});
console.log(array); // [1, 2, 3, 4, 5]

以下是按照数字大小进行降序排列的JavaScript代码实现:

const array = [3, 1, 4, 2, 5];
array.sort(function(a, b) {
  return b - a;
});
console.log(array); // [5, 4, 3, 2, 1]

四、各种排序方法和sort方法的区别

除了基础排序算法和高级排序算法之外,还有很多其他的排序算法,比如希尔排序、计数排序、桶排序和基数排序等。这些算法有各自的优缺点和适用场景。而JavaScript数组的sort方法则只能进行升序排列和降序排列。

总体来说,使用JavaScript数组的sort方法比手写排序函数更为简便,因为它已经很好地考虑了各种情况。但如果我们需要掌握各种排序算法的原理和实现方法,还是需要手写排序函数的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于js 各种排序方法和sort方法的区别(详解) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 通过JS 获取Mouse Position(鼠标坐标)的代码

    获取鼠标坐标是JavaScript中的常见需求之一,可以通过鼠标事件对象获取鼠标相对于页面的坐标位置。 以下是获取鼠标位置的代码: document.addEventListener(‘mousemove’, (event) => { const mouseX = event.clientX; const mouseY = event.clientY;…

    JavaScript 2023年6月10日
    00
  • 说说JSON和JSONP 也许你会豁然开朗

    那我来给您详细讲解一下如何理解JSON和JSONP。 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它使用易于人们阅读和编写的文本格式来传输和存储数据。JSON可以使用JavaScript函数eval()进行解析。 JSON格式由键值对构成,最外层是一个大括号({})形成的对象,键值对之间使用逗…

    JavaScript 2023年6月11日
    00
  • 学习JavaScript设计模式(策略模式)

    学习JavaScript设计模式之策略模式 什么是策略模式?策略模式是一种行为设计模式,它能让你定义一系列算法,将它们封装到一个个独立的类中,可以使它们相互替换。策略模式使得算法可以独立于使用它们的客户端而变化。 在JavaScript中,策略模式通常是通过定义不同的函数来实现的。根据需要,你可以将算法添加到一个对象中,然后把这个对象传递给执行某个方法的函数…

    JavaScript 2023年5月18日
    00
  • python算的上脚本语言吗

    Python通常被归类为一种脚本语言,因为它通常用于编写简单的脚本来完成较小的任务,如自动化一些常见的操作。下面是详细的讲解和两个示例说明: Python是脚本语言吗 Python被称为一种脚本语言,因为它通常被用于编写脚本,这些脚本可以快速完成一些任务,如系统管理、文件处理、数据分析、Web开发和自动化测试等。 此外,Python的语法简单,并且使用方便,…

    JavaScript 2023年5月28日
    00
  • JavaScript日期选择功能示例

    下面是详细讲解“JavaScript日期选择功能示例”的完整攻略: 1. 简介 JavaScript是一种流行的前端编程语言,它可以让网站的交互性更好。其中,日期选择功能是一个常见的功能,在表单上使用时,非常常用。在JavaScript中,我们可以使用Date对象来实现日期相关的功能。本文将演示如何构建一个简单的日期选择器。 2. Date对象 在JavaS…

    JavaScript 2023年5月27日
    00
  • javascript实现计算指定范围内的质数示例

    下面是详细讲解JavaScript实现计算指定范围内的质数的完整攻略。 目录 什么是质数? 计算指定范围内的质数的思路 实现计算指定范围内的质数的步骤 示例1:计算100以内的质数 示例2:计算1000以内的质数 什么是质数? 质数指的是只能被1和它本身整除的自然数,如2、3、5、7、11等等。质数在数学上具有非常重要的地位,也是密码学等领域的基础。 计算指…

    JavaScript 2023年5月28日
    00
  • js open() 与showModalDialog()方法使用介绍

    JS open() 与 showModalDialog() 方法使用介绍 在JavaScript中,通过 open() 与 showModalDialog() 方法可以打开新的浏览器窗口或对话框,提供更好的交互体验。 open() 方法介绍 open() 方法可以在新的浏览器窗口或选项卡中打开一个URL地址。具体语法如下: window.open(url, …

    JavaScript 2023年6月11日
    00
  • JavaScript高级程序设计 阅读笔记(十二) js内置对象Math

    以下是对JavaScript高级程序设计中Math对象的详细讲解: 什么是Math对象 Math对象是JavaScript内置的一个全局对象,提供了许多数学计算相关的方法和常量。通过调用Math对象提供的方法和属性,我们可以进行数值的运算、随机数的生成等操作。 常用方法 Math.abs() Math.abs() 方法用于返回一个数的绝对值,即该数与 0 的…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部