交换类排序-快速排序

94 阅读2分钟

排序算法中可以大致分为以下几类

  1. 插入类排序:直接插入排序、折半插入排序、希尔排序
  2. 选择类排序:简单选择排序、堆排序
  3. 交换类排序:冒泡排序、快速排序

快速排序

简介

快速排序法是由C.A.R Hoarse提出并命名的一种排序方法,被认为是对冒泡排序方法的一种改进。在各种排序方法中,这种方法的元素之间的比较次数较少,因而速度较快,被认识是目前最好的内排序方法之一。

核心思想

快速排序方法的核心思想可以归纳为: 在当前待排序的序列(k1,k2,k3,···,kn)中任意选择一个元素作为分界元素或者基准元素,把小于等于分界元素的所有元素都移到分界元素的前边,把大于等于分界元素的所有元素都移到分界元素的后边。这样,分界元素正好处在排序的最终位置上,并且把当前待排序的序列划分成前后两个子序列(前一个序列都小于分界元素,后一个序列都大于分界元素)。然后,分别对两个子序列递归进行上述过程,知道使得所有元素都到达整个排序后它们应处的最终位置上。

image.png (摘自网图)

把当前待排序的序列按照分界元素划分成前后两个子序列的过程称为一次划分,故快速排序又称为划分排序法

代码实现

var quickSort = function(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  var pivotIndex = Math.floor(arr.length / 2);
  var pivot = arr.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];

  for (var 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));
};

复杂度

最好情况:快速排序最优的情况下时间复杂度为O( nlogn )。
最坏情况:如果待排序的元素初始时已经有序的情况下,快速排序花费的时间最长,最差的情况下时间复杂度为:O( n^2 )。

稳定性

快速排序是不稳定排序。