JavaScript 排序算法

73 阅读2分钟
const arr = [2,3,4,1,5,6];

演示图的地址

冒泡排序

演示图

function bubbleSort(arr) {
  if (Array.isArray(arr)) {
    // 从小到大排
    for (var i = arr.length - 1; i > 0; i--) {
      for (var j = 0; j < i; j++) {
        if (arr[j] > arr[j + 1]) {
          [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        }
      }
    }
    // 从大到小
    // for (var i = 0; i < arr.length; i++) {
    //   for (var j = i; j < arr.length; j++) {
    //     if (arr[j] < arr[j + 1]) {
    //       [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
    //     }
    //   }
    // }
    return arr;
  }
}

插入排序

演示图

function insertSort(arr) {
  if (Array.isArray(arr)) {
    for (var i = 1; i < arr.length; i++) {
      var preIndex = i - 1;
      var current = arr[i]
      while (preIndex >= 0 && arr[preIndex] > current) {
        arr[preIndex + 1] = arr[preIndex];
        preIndex--;
      }
      arr[preIndex + 1] = current;
    }
    return arr;
  }
}

选择排序

演示图

function selectionSort(arr) {
  var len = arr.length;
  var minIndex, temp;
  for (var i = 0; i < len - 1; i++) {
    minIndex = i;
    for (var j = i + 1; j < len; j++) {
      if (arr[j] < arr[minIndex]) { //寻找最小的数
        minIndex = j; //将最小数的索引保存
      }
    }
    temp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = temp;
  }
  return arr;
}

快速排序

详细讲解地址

演示图

第一种方式(效率高)

function quickSort(arr, begin, end) {
  //递归出口
  if (begin >= end)
    return;
  var l = begin; // 左指针
  var r = end; //右指针
  var temp = arr[begin]; //基准数,这里取数组第一个数
  //左右指针相遇的时候退出扫描循环
  while (l !== r) {
    //右指针从右向左扫描,碰到第一个小于基准数的时候停住
    while (l < r && arr[r] >= temp)
      r--;
    //左指针从左向右扫描,碰到第一个大于基准数的时候停住
    while (l < r && arr[l] <= temp)
      l++;
    //交换左右指针所停位置的数
    [arr[l], arr[r]] = [arr[r], arr[l]];
  }
  //最后交换基准数与指针相遇位置的数
  [arr[begin], arr[l]] = [arr[l], arr[begin]];
  //递归处理左右数组
  quickSort(arr, begin, l - 1);
  quickSort(arr, l + 1, end);
  return arr
}

第二种方式(效率低)

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