数据结构中的各种排序方法小结(JS实现)

数据结构中的各种排序方法小结(JS实现)

本文将介绍常见的八种排序算法:

  1. 冒泡排序
  2. 插入排序
  3. 选择排序
  4. 快速排序
  5. 归并排序
  6. 堆排序
  7. 希尔排序
  8. 计数排序

下面进行详细讲解。

冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历数组,比较相邻的两个元素,并按大小交换位置,一直到整个数组排序完成。它的时间复杂度为O(n^2)。

示例代码:

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

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = bubbleSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

插入排序

插入排序是一种简单的排序算法,它每次从未排序的数组中取出第一个元素,将它插入到已排序的数组中的合适位置。插入操作需要将插入位置后面的元素逐个后移,直到找到合适的位置。它的时间复杂度为O(n^2)。

示例代码:

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

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = insertionSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

选择排序

选择排序是一种简单的排序算法,它每次从未排序的数组中选出最小(大)的元素,放到已排序的数组的末尾。它的时间复杂度为O(n^2)。

示例代码:

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

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = selectionSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

快速排序

快速排序是一种常用的排序算法,它采用分治法的思想,将数组分成左右两个子数组,确定一个基准元素,将小于基准元素的放在左边,大于基准元素的放在右边,然后对左右两个子数组递归地调用快速排序。它的时间复杂度为O(nlogn)。

示例代码:

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  const pivotIndex = Math.floor(arr.length / 2);
  const pivot = arr.splice(pivotIndex, 1)[0];
  const left = [];
  const 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));
}

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = quickSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

归并排序

归并排序是一种稳定的排序算法,它使用分治法的思想,将数组递归地分成两半,对每一半递归地调用归并排序,最后将两个有序的子数组归并成一个有序的数组。它的时间复杂度为O(nlogn)。

示例代码:

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

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

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = mergeSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

堆排序

堆排序是一种树形选择排序算法,它的本质是利用堆这种数据结构来维护数组的顺序,利用堆这种数据结构来实现了一个优先队列,堆顶元素为整个堆中的最大(或最小)值。它的时间复杂度为O(nlogn)。

示例代码:

function heapSort(arr) {
  // 对数组进行堆化
  for (let i = Math.floor(arr.length / 2) - 1; i >= 0; i--) {
    heapify(arr, i, arr.length);
  }
  // 依次从堆中取出最大值,放到数组末尾
  for (let i = arr.length - 1; i > 0; i--) {
    [arr[0], arr[i]] = [arr[i], arr[0]];
    heapify(arr, 0, i);
  }
  return arr;
}

function heapify(arr, i, len) {
  let largest = i;
  const left = 2 * i + 1;
  const 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, largest, len);
  }
}

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = heapSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

希尔排序

希尔排序是一种插入排序的变体。它的基本思想是:将数组分成若干个子序列,对每个子序列进行插入排序,每次减少子序列的长度,最后整个数组变成一个有序序列。希尔排序的时间复杂度与选取的增量序列有关,不同的增量序列有不同的时间复杂度。最坏情况下的时间复杂度为O(n^2)。

示例代码:

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

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = shellSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

计数排序

计数排序是一种非基于比较的排序算法,它的核心思想是:统计每个元素出现的次数,计算出每个元素应该出现的位置。它的时间复杂度为O(n+k),其中k为计数数组的大小。

示例代码:

function countingSort(arr) {
  const max = Math.max(...arr);
  const min = Math.min(...arr);
  const len = max - min + 1;
  const count = new Array(len).fill(0);
  for (let i = 0; i < arr.length; i++) {
    count[arr[i] - min]++;
  }
  let index = 0;
  for (let i = 0; i < len; i++) {
    while (count[i] > 0) {
      arr[index++] = i + min;
      count[i]--;
    }
  }
  return arr;
}

const arr = [5, 2, 7, 1, 3, 6];
const sortedArr = countingSort(arr);
console.log(sortedArr); // [1, 2, 3, 5, 6, 7]

以上就是八种常见的排序算法的介绍和JS代码实现。对于每种算法的时间复杂度和优缺点,可以根据实际情况选择使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据结构中的各种排序方法小结(JS实现) - Python技术站

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

相关文章

  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解 本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。 单链表的定义 单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。 单链表的节点定义 单链表的节点通常由结…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

    JavaScript数据结构与算法之二叉树遍历算法详解 什么是二叉树 二叉树是一种每个节点最多只有两个子节点的树结构,可以用来组织数据、搜索、排序等。 二叉树的遍历 遍历是指按照一定次序访问二叉树中的所有节点。常见的二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。以下分别对它们进行详细讲解。 前序遍历 前序遍历是指先访问节点本身,然后再遍历其左子树和右子…

    数据结构 2023年5月17日
    00
  • 数据结构之哈夫曼树与哈夫曼编码

    一、背景 编码是信息处理的基础(重新表示信息)。 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度。但其在传输和存储等情况下编码效率不高。 可使用不等长编码,来压缩编码:高频字符编码长度更短,低频字符编码长度更长。   [例] 将百分制的考试成绩转换成五分制的成绩 按顺序分别编码。 按频率分别编码(高频短编码,类似于香…

    算法与数据结构 2023年4月17日
    00
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列 什么是栈 栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。 栈的基本操作 初始化栈 入栈 出栈 取栈顶元素 判空 判满 // 栈的…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构算法基础之循环队列示例

    标题:C语言数据结构算法基础之循环队列示例 1. 简介 循环队列是一种常见的数据结构,它采用固定大小的数组来模拟队列的数据结构,可以高效地处理队列的进出操作。本文将会讲解循环队列的实现原理和示例代码。 2. 循环队列基本原理 循环队列通过两个指针front和rear来实现队列的添加和删除操作。在初始化时,front和rear的初始值都为0。每当数据进入队列时…

    数据结构 2023年5月17日
    00
  • 手动实现数据结构-栈结构

    1.栈结构 是一种受限的线性结构。 特点:先进后出 2.使用TS实现 1 //封装一个栈 使用泛型类 2 class ArrayStack<T=any>{//给一个默认值为any类型 3 //定义一个数组,用于存储元素 4 private data:T[]=[] 5 //push:将元素压入栈中 6 push(e:T):void{ 7 this.…

    算法与数据结构 2023年4月17日
    00
  • AtCoder Beginner Contest 300

    A – N-choice question (abc300 a) 题目大意 给定一个元素互不相同的数组\(c\)和 \(a,b\),找到 \(i\)使得 \(c_i = a + b\) 解题思路 直接for循环寻找即可。 神奇的代码 #include <bits/stdc++.h> using namespace std; using LL = …

    算法与数据结构 2023年4月30日
    00
合作推广
合作推广
分享本页
返回顶部