排序算法-javascript

96 阅读1分钟

插入排序

// 使用JavaScript实现插入排序
function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let key = array[i]; //当前元素
    let j = i - 1; //已排序的元素
    // 在i之前的元素对比,如果大于key,则后移
    while (j >= 0 && array[j] > key) {
      array[j + 1] = array[j];
      j--;
    }
    array[j + 1] = key; //插入key
  }
  return arr;
}

let array = [12, 11, 13, 5, 6];

console.log("Sorted array is:", insertionSort(array));

快排

  • 也叫分治(Divide and Conquer)算法,将大问题拆分成小问题解决,
  • 选取一个 pivot,大于 pivot 在之后,小于 pivot 在之前(先pivot,再切分)
function quickSort(arr) {
  if (arr.length <= 1) return arr;
  console.log("arr:", arr);
  
  let pivotIndex = Math.floor(arr.length / 2); //基准值索引,数组长度的一半
  console.log("pivotIndex:", pivotIndex);
  
  let pivot = arr.splice(pivotIndex, 1)[0]; // 基准值, splice返回的是数组
  console.log("pivot:", pivot, 'arr->',arr);

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

var arr = [5, 3, 7, 6, 2, 9];
console.log(quickSort(arr)); // 输出: [2, 3, 5, 6, 7, 9]

归并排序

  • 分治思想,分成2个数组
  • 先切分后归并
function mergeSort(arr) {
  if (arr.length < 2) return arr;

  let middle = Math.floor(arr.length / 2); // 中间索引,数组长度的一半
  // 拆分数组
  let left = arr.slice(0, middle); 
  let right = arr.slice(middle, arr.length);
  // 递归排序子数组,然后合并
  return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
  let result = []; 
  while (left.length && right.length) {
    // 从小到大排序
    if (left[0] <= right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  while (left.length) {
    result.push(left.shift());
  }
  while (right.length) {
    result.push(right.shift());
  }
  return result;
}

let array = [4, 2, 5, 22, 1, 6, 3, -3];
console.log("Sorted array is:", mergeSort(array));// Sorted array is: [ -3, 1, 2, 3, 4, 5, 6, 22 ]

参考