重温排序,冲!|刷题打卡

191 阅读1分钟

闲着无聊重新过了一下排序算法,冲!

选择排序

选择排序是最直观的排序方法之一,我们只需要选择出最小的,让后把它放到最前面即可。不过问题也很明显,便是他不够快。

时间复杂度为 O(n2)

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

插入排序

插入排序的时间复杂度是也是 O(n2),不过在输入的数组是已经排列好的情况下,它只用进行一次遍历即可,所以最优时间复杂度为 O(n)

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

快速排序

快排是通过类似二分查找的方法实现的排序,会需要我们先确定一个枢纽值,然后分治大于和小于该值的部分。

快排的效率会优于上面两种排序方法,它的时间复杂度为 O(log(n))。

function quickSort(nums) {
  if (nums.length < 2) {
    return nums;
  }
  let pivot = nums[0];
  let lower = [],
    higher = [];
  for (let i = 1; i < nums.length; i++) {
    if (nums[i] > pivot) {
      higher.push(nums[i]);
    } else {
      lower.push(nums[i]);
    }
  }
  return quickSort(lower).concat(pivot, quickSort(higher));
}

其实也可以通过两行直接写出来:

function quickSort(nums) {
  if (nums.length < 2) return nums;
  return quickSort(nums.slice(1).filter(el => el <= nums[0])).concat(nums[0], quickSort(nums.slice(1).filter(el => el > nums[0])));
}

总结一下