排序算法之三(快速排序)
Posted Mose前端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法之三(快速排序)相关的知识,希望对你有一定的参考价值。
本期内容,我主要讲解快排算法,面试考的几率非常大,毫不避讳说,手写快排是进大厂最基本的要求。希望大家都能掌握。
SUMMER
快排思想
快速排序是一种非常高效的算法,它采用“分而治之”的思想,把大的拆分为小的,小的再拆分为更小的。其原理如下:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部的记录进行快速排序,递归该过程,知道序列中的所有记录均有序为止。具体而言,算法步骤如下:
(1)分解:将输入的序列array[m...n]划分成两个非空子序列array[m...k]和array[k+1...n],使用、array[m...k]中的任一元素的值不大于array[k+1...n]中任一元素的值。
(2)递归求解:通过递归调用快速排序算法分别对array[m...k]和array[k+1...n]进行排序。
(3)合并:由于对分解出的两个子序列的排序是就地进行的,所以在array[m...k]和array[k+1...n]都排序好后,不需要执行任何计算就已让array[m...n]排好序。
以数组[49, 38, 65, 97, 76, 13, 27, 49]为例。第一趟排序过程如下:
初始化关键字:[49 38 65 97 76 13 27 49]
第一次交换后:[27 38 65 97 76 13 49 49]
第二次交换后:[27 38 49 97 76 13 65 49]
从右向左找小于49的数交换位置,从左向右找大于49的数,依次进行
第三次交换后:[27 38 13 97 76 49 65 49]
第四次交换后:[27 38 13 49 76 97 65 49]
整个排序过程如下:
初始化关键字:[49 38 65 97 76 13 27 49]
一趟排序之后:[27 38 13] 49 [76 97 65 49]
二趟排序之后:[13] 27 [38] 49 [49 65] 76 [97]
三趟排序之后:13 27 38 49 49 [65] 76 97
最后的排序结果:13 27 38 49 49 65 76 97
上个图方便大家理解
快速排序算法是通过分治递归来实现的,其效率在很大程度上取决于参考元素的选择,可以选择数组中间的元素,也可以随机得到三个元素,然后选择中间的那个元素(三数中值法)。另外,当我们在进行分割时,如果分割出来的子序列的长度很小的话(小于20)通常递归的排序效率就没有诸如插入排序或希尔排序那么快了。因此,可以先判断数组长度再选择算法。
算法的复杂度分析
平均情况:T(n) = O(nlogn)
最差情况:T(n) = O(n²)
平均情况:T(n) = O(nlogn)
空间复杂度:O(n)
占用常数内存,不占用额外内存,是一种不稳定的算法。
SUMMER
JavaScript代码实现
function quickSort(arr) {
var length = arr.length;
if(length <= 1) {
return arr;
}
var base_num = arr[0], left_array = [], right_array = [];
for(var i = 1; i < length; i++) {
if(base_num > arr[i]) {
left_array.push(arr[i]);
} else {
right_array.push(arr[i]);
}
}
left_array = quickSort(left_array);
right_array = quickSort(right_array);
return left_array.concat([base_num],right_array);
}
var arr = [49, 38, 65, 97, 76, 13, 27, 49], txt = "";
for (var k in arr) {
txt += arr[k] + " ";
}
console.log("排序前:", txt);
arr = quickSort(arr);
txt = "";
for (k in arr) {
txt += arr[k] + " ";
}
console.log("排序后:", txt);
结果显示如图
每日鸡汤
别等待,别遗憾,去经历,无需畏惧
SLIGHT HEAT #2021#
Mose前端
微信
CuiXin992173697
以上是关于排序算法之三(快速排序)的主要内容,如果未能解决你的问题,请参考以下文章