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

yizhihongxing

针对“基于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日

相关文章

  • 利用JavaScript制作一个搞怪的兔子动画效果

    制作一个搞怪的兔子动画效果需要使用JavaScript和CSS。以下是具体的步骤: 实现步骤 1. 创建网页 首先,需要创建一个网页,可以使用HTML来实现。在网页中,需要有一个用来承载兔子动画效果的容器,例如: <!DOCTYPE html> <html> <head> <title>搞怪的兔子动画效果&lt…

    JavaScript 2023年6月10日
    00
  • 浅谈js函数的多种定义方法与区别

    下面就为您详细讲解“浅谈js函数的多种定义方法与区别”的完整攻略。 1. 函数的多种定义方法 在JavaScript中,函数有多种定义方法,常见的有函数声明、函数表达式、箭头函数、构造函数、生成器函数等。 1.1 函数声明 函数声明是定义函数的一种方式,语法如下: function functionName(parameter1, parameter2, .…

    JavaScript 2023年5月27日
    00
  • 使用jquery如何获取时间

    获取时间可以使用JavaScript中的Date对象。jQuery是JavaScript的一个库,提供了方便的方法来操作DOM和事件,但它并没有提供直接获取时间的方法。因此,在jQuery中获取时间的方法与原始JavaScript相同。以下是获取时间的两种示例方法: 方法一:使用原始JavaScript 使用 new Date() 方法创建一个Date对象:…

    JavaScript 2023年5月27日
    00
  • Flutter web bridge 通信总结分析详解

    Flutter web bridge 通信总结分析详解 本文将详细讲解Flutter Web中的Bridge通信机制。Flutter Web框架中,开发者可以使用Bridge来实现Flutter与Web端的通信交互。Bridge通信机制主要包含以下三个部分:Method Channel、Event Channel、Basic Message Channel。…

    JavaScript 2023年6月11日
    00
  • 判断目标是否是window,document,和拥有tagName的Element的代码

    判断目标是否是 Window, Document 和拥有 tagName 的 Element 是前端开发中一种常见的操作,以下是该操作的完整攻略: 1. 判断目标是否是 Window 对象 判断一个对象是否是 Window 对象,可以通过将该对象与全局的 window 对象进行比较,相关代码如下: function isWindow(obj) { retur…

    JavaScript 2023年6月10日
    00
  • javascript计时器详解

    JavaScript 计时器详解 在 JavaScript 中,计时器可用于一些常见的操作,如延迟某个函数执行、定期执行某个函数,或者对函数的执行进行监控。JavaScript 提供了 setTimeout() 和 setInterval() 两个函数来实现这些操作。 setTimeout() setTimeout() 可以在指定的时间之后执行一个函数。其语…

    JavaScript 2023年5月27日
    00
  • 关于base64编码和解码的js工具函数

    下面我将为您详细讲解“关于base64编码和解码的js工具函数”的完整攻略。 什么是Base64编码? Base64是一种用于将二进制数据转换成可打印ASCII字符的编码方式。Base64编码使用64种ASCII字符来表示二进制数据,每三个字节为一组,每组由四个字符表示。 为什么需要Base64编码? 由于许多应用程序只能处理ASCII字符,而不能处理二进制…

    JavaScript 2023年5月19日
    00
  • Hammer.js+轮播原理实现简洁的滑屏功能

    下面是关于“Hammer.js+轮播原理实现简洁的滑屏功能”的完整攻略,主要包括以下内容: Hammer.js是什么及其使用 轮播原理及实现 基于Hammer.js的滑屏操作 示例说明 1. Hammer.js是什么及其使用 Hammer.js是一款轻量级的JS插件,可以帮助我们更加轻松地实现触屏操作,比如拖拽、缩放、旋转等。Hammer.js具有以下几个特…

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