JavaScript 中的冒泡排序 概念 1 概念 2 运行时

2025-05-24

JavaScript 中的冒泡排序

概念 1

概念 2

运行时

冒泡排序是最受广泛讨论的算法之一,仅仅是因为它对数组排序效率低下。如果数组已经排序,冒泡排序只会遍历该数组一次(使用下面的概念二),然而最坏的情况是运行时间为 O(N²),效率极低。

甚至前总统巴拉克·奥巴马也承认冒泡排序的低效率

当我们绘制 O(N²) 的增长率时,我们发现,与其他排序算法(如归并排序,O(N Log N))相比,它的增长速度要快得多。

图表

鉴于冒泡排序的残酷性,理解该算法并解释其为何如此糟糕仍然很重要。

让我们深入研究一下冒泡排序编码的两个概念。

概念 1

  • 遍历数组并检查每个元素是否与数组中的下一个元素相同。
  • 如果当前元素大于下一个元素,则交换它们。
  • 如果不大于,则向上移动指针并比较接下来的两个元素。
  • 一旦到达数组的末尾,我们就知道最大的元素位于最后一个位置。
  • 重复此过程 N 次,其中 N 是数组的长度,每次迭代到最后排序的元素。

概念 1 的可视化

让我们看一下如何在长度为 6 的数组上运行它。

冒泡排序 1

概念 1 代码

我们需要两个指针(两个嵌套循环)来表示概念一。每次迭代时,上界都会减一,因为我们知道这个索引包含一个已排序的值。

function bubbleSortConcept1(arr) {
  for (let j = arr.length - 1; j > 0; j--) {
    for (let i = 0; i < j; i++) {
      if (arr[i] > arr[i + 1]) {
        let temp = arr[i];
        arr[i] = arr[i + 1];
        arr[i + 1] = temp;
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

概念 2

  • 遍历数组并检查每个元素是否与数组中的下一个元素相同。
  • 如果当前元素大于下一个元素,则交换它们。
  • 表示交换已经发生。
  • 如果发生交换,则再次循环遍历数组。
  • 当没有发生交换时,我们知道数组是排序的。

冒泡排序 2

概念 2 代码

此方法只需要一个指针,因为我们使用一个变量来存储布尔值,用于指示是否发生了交换。与概念一不同,此概念要求我们每次遍历数组中的每个元素时都要对其进行迭代。

function bubbleSortConcept2(arr) {
  let swapped;

  do {
    swapped = false;
    console.log(arr);
    arr.forEach((item, index) => {
      if (item > arr[index + 1]) {
        // Save the value to a variable so we don't lose it
        let temp = item;
        arr[index] = arr[index + 1];
        arr[index + 1] = temp;
        swapped = true;
      }
    })
  } while (swapped);
}
Enter fullscreen mode Exit fullscreen mode

运行时

冒泡排序是最低效的排序算法之一,复杂度为 O(N²)。最坏的情况下,我们必须将数组中的每个元素与其他所有元素进行比较,因此复杂度为 O(N²)。

文章来源:https://dev.to/emmabostian/bubble-sort-in-javascript-2con
PREV
滚动条 CSS 用 24 行 CSS 创建自定义滚动条 HTML。CSS。JavaScript。结论。
NEXT
6 Mistakes You Might Be Making As A New Web Developer & How To Avoid Them Relying On jQuery Relying On JavaScript Frameworks & Libraries Relying On Bootstrap Not Modularizing Your Code Not Using Semantic HTML Not Learning Responsive Design