快速排序之算法
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)。
以上是关于快速排序之算法的主要内容,如果未能解决你的问题,请参考以下文章