快速排序是最效率极高的一种排序方法,正因为它效率高,所以也受到了面试官的青睐,同样成了程序员必会的内容。O(∩_∩)O哈哈~
它的思想是选一个基准,然后把小于基准的值放在左边,大于基准的值放在右边(假设从小到大排序)。然后分别递归左边和右边的部分,当所有的递归完毕后就是已经排好序的结果了。
市面上流传最广的快速排序是阮一峰老师博客中写的,我们这笔直接拿过来记录一下,原文在这里。
1 | var quickSort = function(arr) { |
阮一峰老师的快速排序选择的是最中间的元素作为基准,左边和右边的都定义了一个新的数组来接收,最后把数组连接起来。这个快速排序的优点是思路很明确,缺点是因为定义了新的数组所以空间复杂度比较高。那如何降低空间复杂度呢?其实只要操作元数组就可以了,这里给出另一种快速排序的实现:
1 | function sort(arr,low,high){ |
这个快速的时间复杂度要比阮一峰老师的稍微低一点,不过比阮一峰老师的快速排序稍微难理解一点。其实我们在《JavaScript数据结构与算法》读书笔记一文中也有快速排序的记录,那个快速排序与这个有一点点的不同,那个排序的基准选择的中间值,然后每次循环直接交换左侧的和右侧的元素,整体思路相差无几,感兴趣的可以在那篇文章中搜一下快速排序。