排序算法之三(快速排序)

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 



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

STL六大组件中算法模块sort为啥采用快速排序作为底层思想

快速排序-递归实现

快速排序之三数取中法

经典(java版)排序算法的分析及实现之三简单选择排序

白话经典算法系列之三 希尔排序的实现

八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)