还只知道冒泡排序吗?这五个算法让你在编程路上“快人一步”!

80 阅读2分钟

前言

一位同学面试了一家公司。到了谈薪资的阶段,但他要的薪资无法被满足,最后老板提了一个要求——写出一个排序算法加1000,最终他只写出了一个我们众所周知的“冒泡排序”。真人真事。

排序算法虽然是计算机科学中的基础知识,但是可以考察一个人对基础知识的熟练程度从而反映一个人的编程能力和逻辑思维能力。让我们看看有那些常见的排序算法,然后熟练掌握他们。也让我们遇到上面的挑战时,轻轻松松涨薪。

Main

1.冒泡排序

虽然总说“你只会冒泡排序吧”,但是总有人连冒泡排序也写不出来。这样的话岂不是很尴尬。

**思路:**比较相邻的元素,如果前一个比后一个大,就交换它们。对于每一轮排序,都会将未排序部分中最大的元素“冒泡”到数组的末尾,因此称为冒泡排序。时间复杂度为 O(n^2)。

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]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

2.选择排序

**思路:**每次找到未排序部分中最小的元素,然后放到已排序部分的末尾。时间复杂度为 O(n^2)。

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

3.插入排序

**思路:**将数组分为已排序和未排序两部分,从未排序部分取出一个元素插入到已排序部分的正确位置。时间复杂度为 O(n^2),但在大多数情况下比冒泡排序和选择排序更快。

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

4.快速排序

**思路:**选择一个基准元素,将数组分为两部分,小于基准元素的放在左边,大于基准元素的放在右边。然后对左右两部分递归地应用快速排序。时间复杂度为 O(nlogn),但在最坏情况下可能会达到 O(n^2)。

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));
}

5.归并排序

**思路:**将数组分为两部分,对每部分递归地应用归并排序,然后将两部分合并成一个有序数组。时间复杂度为 O(nlogn)。

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

function merge(left, right) {
  let 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));
}

**结束语:**如果对您有帮助!点个赞:+1:加个关注吧:heart:,有问题评论区留言交流哦!