美文网首页
前端-快速排序 (交换排序)

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

作者: FConfidence | 来源:发表于2018-09-07 23:18 被阅读41次
  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);

相关文章

  • PHP 实现快速排序

    导语 这篇了解下快速排序。 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-...

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

    算法思想:在待排序的表中L[0....n-1]中, 任意取一个元素作为基准值pivot, 通过一趟排序将待排序列划...

  • 2018-07-11快速排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort)...

  • python实现快速排序

    快速排序快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),...

  • 排序与搜索——快速排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort)...

  • 排序与搜索:快速排序

    快速排序 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),通过...

  • 快速排序

    快速排序 快速排序简介 快速排序是一种基于交换的排序方式(另一种基于交换的排序方式是冒泡排序),它的时间复杂度是n...

  • 排序算法之交换排序

    利用交换数据元素的位置进行排序的方法称为交换排序。常见的交换排序方法有冒泡排序和快速排序。 1. 冒泡排序 1.1...

  • 交换类排序算法-冒泡排序、快速排序

    交换类排序 1.冒泡排序 2.快速排序 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用...

  • 排序算法

    冒泡排序 选择排序 插入排序二分插入排序希尔排序 堆排序 归并排序 快速排序 交换排序类:冒泡排序快速排序 选择排...

网友评论

      本文标题:前端-快速排序 (交换排序)

      本文链接:https://www.haomeiwen.com/subject/kqnhgftx.html