返回

用JavaScript实现冒泡排序(详解双向冒泡排序)

前端

冒泡排序(Bubble Sort)是一种简单的排序算法,基于以下原理:它反复遍历数组,每次将相邻元素进行比较,如果顺序错误,就交换它们的位置。这种遍历和比较的过程一直持续到没有更多需要交换的元素为止。

算法步骤

以下是冒泡排序算法的步骤:

  1. 从数组的第一个元素开始,将其与下一个元素进行比较。
  2. 如果第一个元素大于第二个元素,则交换这两个元素的位置。
  3. 继续比较第二个元素与第三个元素,如果第二个元素大于第三个元素,则交换这两个元素的位置。
  4. 依次类推,直到比较到数组的最后一个元素。
  5. 重复步骤1到4,直到数组完全排序。

JavaScript实现

function bubbleSort(array) {
  let swapped;
  do {
    swapped = false;
    for (let i = 0; i < array.length - 1; i++) {
      if (array[i] > array[i + 1]) {
        let temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
        swapped = true;
      }
    }
  } while (swapped);
  return array;
}

双向冒泡排序

双向冒泡排序是冒泡排序的一种优化版本,它同时从数组的两端向中间遍历,并交换错误顺序的元素。这种双向遍历可以减少比较次数,从而提高算法的效率。

function bidirectionalBubbleSort(array) {
  let left = 0;
  let right = array.length - 1;
  let swapped = true;

  while (left < right && swapped) {
    swapped = false;
    // 从左到右遍历
    for (let i = left; i < right; i++) {
      if (array[i] > array[i + 1]) {
        let temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
        swapped = true;
      }
    }
    right--;

    // 从右到左遍历
    for (let i = right; i > left; i--) {
      if (array[i] < array[i - 1]) {
        let temp = array[i];
        array[i] = array[i - 1];
        array[i - 1] = temp;
        swapped = true;
      }
    }
    left++;
  }

  return array;
}

空间复杂度和时间复杂度

冒泡排序的时间复杂度为O(n^2),因为最坏情况下需要比较每个元素多次。空间复杂度为O(1),因为只需要很少的额外空间来存储临时变量。双向冒泡排序的时间复杂度也为O(n^2),但由于减少了比较次数,因此通常比普通冒泡排序更快。

结论

冒泡排序是一种简单而有效的排序算法,特别适用于小型数组。双向冒泡排序是冒泡排序的一种优化版本,可以减少比较次数,提高算法的效率。