快速排序
排序算法是计算机科学最古老,最基本的课题之一了,要想成为合格的程序员,还是要理解和掌握下各种排序算法。
快排在前端面试中问到的挺多的,想着不要丢分就总结下知识点,忘记的时候过来看看。
快排的方法就是就是找个基准,然后比大小,基准左边的永远小于基准,基准右边的永远大于或等于基准,然后,基准左边的划分为一个区域,基准右边的划分为一个区域,在区域内重复操作,直到,划分区域只有1个为止
比如 我们找中间的基准为6
1 | [1,2,3,4,5,6,2,3,45,6] |
第一趟快排下来就是
1 | [1,2,3,4,5,3] 6 [45,6] |
第二趟下来就是
1 | [1,2] 3 [4,5,3] 6 6 45 |
第三趟下来就是
1 | 1 2 3 [4,3] 5 6 6 45 |
第四趟下来就是
1 | [1] [2] [3] [3] [4] [5] [6] [6] [45] |
排序完成
可以看到的规律是,和基准比较,比基准小的就放在左边,大于或等于就放在右边,左边的称为一个新区域,右边的成一个新区域,然后重新选择左边的基准,重新选择右边的基准,只到没有区域为止或区域为1时结束。
可以用js一行代码就实现。用filter(数组的迭代方法),concat(数组的合并方法),slice(切分方法)
1 | function quickSort(arr){ |
可能这种方法不容易理解,而且也用了filter对时间复杂度之类的可能会产生影响,所以就用最原始的方法阐述下
没用阮一峰大神的博客的那个版本,因为那种写法每次都生成一个空数组,空间复杂度会很大,而且每次都重新排序会很慢,但是很好理解。
阮一峰大神的版本地址点击这里
下面是我们实现的不添加新数组空间的快排
1 | //快排主函数 |
还有以下方法
实现快排的关键在于,先在数组中选一个数作为基数,接着以基数为中心将数组中的数字分为两部分,比基数小的放在数组的左边,比基数大的放再数组的右边,接下来就可以用递归的思路对基数的左右两边进行排序。
总结为以下三个步骤
1.从数组中取出一个数作为基数
2.分区,将数组分为两部分,比基数小的放在数组的左边,比基数大的放在数组的右边。
3.递归使左右区间重复第二步,直至各个区间只有一个数。
下面这方法是两端分别扫描,然后交换最后达到排序效果
1 | function quick(arr,left,right){ |