# 四种排序

测试过程中发现,数组长度大于 10000 之后,快速排序的时间无明显波动,但超过 1000000 之后会爆栈

/**
 * 生成 n 个随机数
 */
function getRandomArr(n) {
  return Array(n)
    .fill(1)
    .map(() => Math.floor(Math.random() * 100));
  // return [6, 5, 4, 3, 2, 1]
}

/**
 * 交换值
 */
function swap(arr, indexA, indexB) {
  let c = arr[indexA];
  arr[indexA] = arr[indexB];
  arr[indexB] = c;
}

/**
 * 冒泡排序
 */
function buddleSort(arr) {
  let length = arr.length;
  for (let i = 0; i < length; i++) {
    for (let j = i + 1; j < length; j++) {
      if (arr[j] < arr[i]) {
        swap(arr, i, j);
      }
    }
  }
  return arr;
}

/**
 * 选择排序
 */
function selectionSort(arr) {
  let length = arr.length;
  for (let i = 0; i < length; i++) {
    let k = i;
    for (let j = i + 1; j < length; j++) {
      if (arr[j] < arr[k]) {
        k = j;
      }
    }
    if (k !== i) {
      swap(arr, i, k);
    }
  }
  return arr;
}

/**
 * 插入排序
 */
function insertionSort(arr) {
  let length = arr.length;
  for (let i = 1; i < length; i++) {
    for (let j = i; j >= 0; j--) {
      if (j === 0 || arr[i] > arr[j - 1]) {
        if (j !== i) {
          let temp = arr[i];
          arr.splice(i, 1);
          arr.splice(j, 0, temp);
        }
        break;
      }
    }
  }
  return arr;
}

/**
 * 快速排序
 */
function quickSort(arr) {
  let length = arr.length;
  if (length < 2) {
    return arr;
  } else if (length === 2) {
    if (arr[0] > arr[1]) {
      swap(arr, 0, 1);
    }
    return arr;
  } else {
    let middleIndex = Math.floor(length / 2);
    let leftArr = [];
    let rightArr = [];
    for (let i = 0; i < length; i++) {
      if (i === middleIndex) {
        continue;
      }
      let temp = arr[i];
      if (temp <= arr[middleIndex]) {
        leftArr.push(temp);
      } else {
        rightArr.push(temp);
      }
    }
    return [...quickSort(leftArr), arr[middleIndex], ...quickSort(rightArr)];
  }
}

function getSortTime(sortFunc, length = 20000, number = 1) {
  let time = Date.now();
  for (let i = 0; i < number; i++) {
    sortFunc(getRandomArr(length));
  }
  console.log("时间:" + (Date.now() - time) / 1000);
}

console.log("------- 四种排序结果:-------");
console.log("冒泡:" + buddleSort(getRandomArr(20)).join(","));
console.log("选择:" + selectionSort(getRandomArr(20)).join(","));
console.log("插入:" + insertionSort(getRandomArr(20)).join(","));
console.log("选择:" + quickSort(getRandomArr(20)).join(","));
console.log("------- 四种排序结果:-------");
console.log();
console.log();
console.log();

console.log("------- 排序时间对比:-------");
console.log("冒泡:");
getSortTime(buddleSort);
console.log("选择:");
getSortTime(selectionSort);
console.log("插入:");
getSortTime(insertionSort);
console.log("快速:");
getSortTime(quickSort);
console.log("------- 排序时间对比:-------");
Last Updated: 9/20/2024, 7:36:32 AM