快速排序之算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序之算法相关的知识,希望对你有一定的参考价值。

一、定义
快速排序是一种基于比较的排序算法,通过选取平均数将整个数据集划分成两部分,并把所有小于平均数的元素移动到平均数左边;在左半部分重复上述操作,直到左边部分的排序完成后,对右边部分执行相同的操作。
二、算法思想
先确定一个“支点”,将所有小于“支点”的值都放在该点的左侧,大于“支点”的值都放在该点的右侧,然后对左右两侧不断重复这个过程,直到所有排序完成。
三、具体实现

function quickSort1(arr) {
  var len = arr.length;
  if (len < 2) {
    return arr;
  }
  var midIndex = Math.floor(len / 2); // 中间元素的索引值
  var baseValue = arr.splice(midIndex, 1); // 基准值

  var left = []; // 保存小于基准值元素
  var right = []; // 保存大于或等于基准值元素

  for (var i = 0; i < arr.length; i++) {
    if (arr[i] < baseValue) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return quickSort1(left).concat(baseValue, quickSort1(right));
}
console.log(quickSort1([3,115,9,2,11,6,3,19]));
function quickSort2(arr, left, right) {
  var len = arr.length,
      partitionIndex,
      left = typeof left != ‘number‘ ? 0 : left,
      right = typeof right != ‘number‘ ? len - 1 : right;

  if (left < right) {
    partitionIndex = partition(arr, left, right);
    quickSort2(arr, left, partitionIndex-1);
    quickSort2(arr, partitionIndex+1, right);
  }
  return arr;
}

function partition(arr, left ,right) {     //分区操作
  var pivot = left,                      //设定基准值(pivot)
      index = pivot + 1;
  for (var i = index; i <= right; i++) {
    if (arr[i] < arr[pivot]) {
      swap(arr, i, index);
      index++;
    }        
  }
  swap(arr, pivot, index - 1);
  return index-1;
}

function swap(arr, i, j) {
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

console.log(quickSort2([3,115,91,2,11,6,3,19]));

四、效率分析
快速排序排序效率非常高。虽然它运行最糟糕时将达到O(n²)的时间复杂度,但通常,平均来看,它的时间复杂为O(nlogn),比同样为O(nlogn)时间复杂度的归并排序还要快。快速排序似乎更偏爱乱序的数列,越是乱序的数列,它相比其他排序而言,相对效率更高。
Chrome的v8引擎为了高效排序,在排序数据超过了10条时,便会采用快速排序,对于10条及以下的数据采用的便是插入排序。
同选择排序相似,快速排序每次交换的元素都有可能不是相邻的,因此它有可能打破原来值为相同的元素之间的顺序。因此,快速排序并不稳定。
1、时间复杂度
最坏的情况:时间复杂度为O(n²);
最佳的情况:时间复杂度为O(n);
平均来讲,时间复杂度为O(nlogn)。
2、空间复杂度
空间复杂度为常量O(nlogn)。

以上是关于快速排序之算法的主要内容,如果未能解决你的问题,请参考以下文章

常用算法的简洁代码实现之快速排序归并排序

排序算法之快速排序

排序算法之快速排序

快速排序-递归实现

重温基础算法内部排序之快速排序法

重温基础算法内部排序之快速排序法