首页 > 编程语言 >JavaScript 排序算法

JavaScript 排序算法

时间:2023-01-25 15:00:33浏览次数:46  
标签:arr 复杂度 JavaScript length 算法 let 排序

JavaScript 提供了 Array.prototype.sort() 方法来对数组中的元素进行排序。默认情况下,sort() 方法使用字典序来排序字符串。如果要按照数字大小进行排序,需要传递一个比较函数。

常用排序算法:

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 快速排序
  • 归并排序
  • 堆排序

如果需要对大数据进行排序,建议使用更高效的排序算法,比如快速排序或归并排序。

1、冒泡排序

冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

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

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

冒泡排序是稳定排序。时间复杂度为 O(n^2),空间复杂度为 O(1),因此在处理大数据集时效率较低。

2、选择排序

选择排序是一种简单的排序算法,它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

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

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;
      }
    }
    if (minIndex !== i) {
      let temp = arr[i];
      arr[i] = arr[minIndex];
      arr[minIndex] = temp;
    }
  }
  return arr;
}

选择排序是不稳定排序。时间复杂度为 O(n^2),空间复杂度为 O(1),因此在处理大数据集时效率较低。

选择排序的优化版本有堆排序,它的时间复杂度为O(nlogn),空间复杂度为O(1)。

3、插入排序

插入排序是一种简单的排序算法。它的基本思想是将一个数据元素插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。

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

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

插入排序是稳定的排序算法。时间复杂度为 O(n^2),空间复杂度为 O(1)。因此当待排序数据量小或部分有序时,插入排序效率较高。

4、快速排序

快速排序是一种分治算法。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

以下是 JavaScript 中实现快速排序的示例代码:

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

快速排序不是稳定排序算法。时间复杂度最差为 O(n^2),平均为O(n*log(n)),空间复杂度为 O(log(n)),是一种高效的排序算法。

快排常常被认为是排序算法中最快的,但是在最坏情况下,比如每次都选到最大值或最小值作为 pivot,就会变成 O(n^2) 的,所以在实际应用中,选取 pivot 的方法很重要。

5、归并排序

归并排序是一种分治算法。它的基本思想是将待排序的序列分成若干个长度为1的子序列,然后不断地将相邻的两个有序子序列合并,直到最后得到一个完整的有序序列。

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

function mergeSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  let middle = Math.floor(arr.length / 2);
  let left = arr.slice(0, middle);
  let right = arr.slice(middle);
  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());
    }
  }
  return result.concat(left, right);
}

归并排序是稳定排序算法。时间复杂度为 O(n*log(n)),空间复杂度为 O(n),属于高效排序算法。

归并排序是一种稳定的排序算法。时间复杂度和空间复杂度都比较高,在处理大数据集时效率较低。在实际应用中,归并排序常常与其他排序算法相结合,比如归并排序+快排,来提高算法的性能。

6、堆排序

堆排序是一种选择排序算法,它的基本思想是利用堆这种数据结构所设计的一种排序算法。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

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

function heapSort(arr) {
  buildMaxHeap(arr);
  for (let i = arr.length - 1; i > 0; i--) {
    swap(arr, 0, i);
    heapify(arr, 0, i);
  }
  return arr;
}

function buildMaxHeap(arr) {
  let start = Math.floor(arr.length / 2) - 1;
  for (let i = start; i >= 0; i--) {
    heapify(arr, i, arr.length);
  }
}

function heapify(arr, i, max) {
  let index, leftChild, rightChild;
  while (i < max) {
    index = i;
    leftChild = 2 * i + 1;
    rightChild = 2 * i + 2;
    if (leftChild < max && arr[leftChild] > arr[index]) {
      index = leftChild;
    }
    if (rightChild < max && arr[rightChild] > arr[index]) {
      index = rightChild;
    }
    if (index === i) {
      return;
    }
    swap(arr, i, index);
    i = index;
  }
}

function swap(arr, i, j) {
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

堆排序是不稳定排序算法,时间复杂度为 O(n*log(n)),空间复杂度为 O(1)。因此堆排序是一种高效排序算法。

堆排序是一种不稳定的排序算法,时间复杂度比较优秀,且实现简单,属于高效排序算法。

 

标签:arr,复杂度,JavaScript,length,算法,let,排序
From: https://www.cnblogs.com/yuzhihui/p/17066944.html

相关文章

  • JavaScript 运算符&算数运算符
    一、运算符运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。JavaScript中常用的运算符有:算数运算符递增和递减运算符比较运算符逻辑运算符赋......
  • MySQL之排序查询与分页查询Python解释器详解实现代理池的API模块
    一、排序查询语法排序查询语法:select*from表名orderby列1asc|desc[,列2asc|desc,...]语法说明:先按照列1进行排序,如果列1的值相同时,则按照列2排序,以此类推asc......
  • JavaScript学习笔记—函数的bind
    bind():函数的方法,可以用来创建一个新的函数bind可以为新函数绑定thisbind可以为新函数绑定参数functionfn(a,b,c){console.log("fn执行了~~~",this);consol......
  • 代码随想录算法训练营day11 | leetcode 20. 有效的括号 1047. 删除字符串中的所有相邻
    基础知识StringStringBuilder操作publicclassStringOperation{intstartIndex;intendIndex;{//初始容量为16个字符主要做增删查......
  • JavaScript学习笔记—函数中的call和apply
    调用函数除了通过函数()这种形式外,还可以通过其他的方式来调用函数,比如可以通过调用函数的call()和apply()两个方法来调用函数函数.call()函数.apply()call和apply除......
  • 对质数取模结果(扩展欧几里得算法模板)爬树甲壳虫
    问题描述有一只甲壳虫想要爬上一颗高度为 �n的树,它一开始位于树根,高度为 00,当它尝试从高度 �−1i−1 爬到高度为 �i 的位置时有 ��Pi​ 的概率会掉回树根,求它从树根爬......
  • 代码随想录算法训练营第29天
    今日刷题两道:216.组合总和III, 17.电话号码的字母组合。216.组合总和III题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92......
  • JavaScript学习笔记—可变参数
    可变参数可以接收任意数量实参,并将他们统一存储到一个数组中返回可变参数的名字可以自己指定可变参数就是一个数组,可以直接使用数组的方法可变参数可以配合其他参数一......
  • 匈牙利算法
    匈牙利算法基础例题:【模板】二分图最大匹配题目描述给定一个二分图,其左部点的个数为n,右部点的个数为m,边数为e,求其最大匹配的边数。左部点从1至n编号,右部点从1......
  • 第一章 基础算法
    目录1快速排序算法1.2第k个数2归并排序算法2.2逆序对数量3二分3.1数的范围3.2数的三次方根4高精度算法4.1加法4.2减法4.3乘法4.4除法5前缀和与差分5.1一维......