前端-快速排序 (交换排序)

  1. 算法思想:

    • 在待排序的表中L[0....n-1]中, 任意取一个元素作为基准值pivot, 通过一趟排序将待排序列划分为两个独立的部分, 其中L[0 ... k-1]和L[k+1 ... n-1]
    • 其中L[0 ... k-1]所有的元素都小于pivot基准元素, L[k+1 ... n-1]中的元素都大于或者等于pivot
    • 同时将pivot放在最终的位置L[k]上的这一趟过程称之为快速排序
  2. 时间复杂度: O(n * log2n)

  3. 稳定性: 不稳定

  4. 优化:

    • 当递归过程中的子序列的规模较小的时, 不要再继续递归调用快速排序, 可以采用直接插入排序算法进行后续的操作
    • 尽量选取一个可以将数据中分的枢纽元素 (从序列中头尾以及中间选取三个元素, 将三个元素的中间值作为枢纽元素, 或者随机在序列中获取)
/* 时间复杂度: log2n*/
function QuickSort(arr, low, high) {
  if (low < high) {
    const pivotPos = PartionSort(arr, low, high);
    QuickSort(arr, low, pivotPos);
    QuickSort(arr, pivotPos + 1, high);
  }
}

/* 时间复杂度: n */
// 一次PartionSort之后 将arr[low]放在了合适的位置上, 其左侧都比其小, 右侧都比其大
function PartionSort(arr, low, high) {
  // 将当前表中的第一个元素当做枢纽值
  const pivot = arr[low];
  while (low < high) {
    while (low < high && arr[high] >= pivot) high--;
    arr[low] = arr[high];
    while (low < high && arr[low] <= pivot) low++;
    arr[high] = arr[low];
  }
  arr[low] = pivot;
  return low;
}

/*
    随机选择基准值pivot
*/
function PartionSort2(arr, low, high) {
  const randIndex = low + Math.floor(Math.random() * (high - low + 1));
  // 将随机索引处的值 切换到第一个的位置
  Swap(arr, randIndex, low);
  // 置当前表中的第一个元素为基准元素
  const pivot = arr[low];
  let i = low;
  // 从第二个元素开始, 将比pivot小的元素  移动到pivot的前面即可
  for (let j = low + 1; j <= high; j++) {
    if (arr[j] < pivot) {
      Swap(arr, ++i, j);
    }
  }
  Swap(arr, i, low);
  return i;
}

function Swap(arr, low, high) {
  const temp = arr[low];
  arr[low] = arr[high];
  arr[high] = temp;
  return arr;
}

const a = [5, 2, 4, 3, 8, 6, 9, 0, 1, 7];
QuickSort(a, 0, a.length - 1);
console.log(a);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,757评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,251评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,295评论 0 2
  • quicksort可以说是应用最广泛的排序算法之一,它的基本思想是分治法,选择一个pivot(中轴点),将小于pi...
    黎景阳阅读 486评论 0 1
  • 每日一抽,觉察练习: 1、直觉他叫什么名字:江 2、他几岁了:10 3、他现在是什么状态:平静 4、他有什么愿望吗...
    悦诚然阅读 172评论 0 2