JS实现的算法(一)--快速排序

187 阅读1分钟

快速排序

第一种方法

// 使用JS API比较多,需要开辟额外的存储空间
function quickSort(arr) {
  if(arr.length == 1) {
    return arr
  }
  const temp = arr[0];
  const left = [];
  const right = [];
  for(let i = 1; i < arr.length; i++) {
    if (arr[i] <= temp) {
      left.push(arr[i])
    } else {
      right.push(arr[i])
    }
  }
  return quickSort(left).concat([temp], quickSort(right))
}

第二种方法

// 较难理解
function quickSort2(arr) {
  // 交换
  function swap(arr, i, k) {
    let temp = arr[i];
    arr[i] = arr[k];
    arr[k] = temp;
  }

  function partition(arr, left, right) {        
    let storeIndex = left; // 准备交换的位置
    let pivot = arr[right]; // 直接选最右边的元素为基准元素
    for(let i = left; i < right; i++) {
      if(arr[i] < pivot) {
        swap(arr, storeIndex, i);
        storeIndex++; // 交换位置后,storeIndex 自增 1,代表下一个可能要交换的位置
      } 
    }
    swap(arr, storeIndex, right); // 将基准元素放置到最后的正确位置上
    return storeIndex;
  }

  function sort(arr, left, right) {
    if(left > right) {
      return;
    }
    let storeIndex = partition(arr, left, right);
    sort(arr, left, storeIndex - 1);
    sort(arr, storeIndex + 1, right);
  }
  sort(arr, 0, arr.length - 1);
  return arr;
}