简介
自从用上了lodash以后,这些基础的算法都很少碰了,现在重温了一下。快速排序的话核心就是分而治之。
步骤
先把核心的比较部分拆分出来,叫partition:
1 | function partition(arr,left,right){ |
- 设比较值。
pivot是随机抽取的比较值,国内多是数组中位数,国外多是最后一个数。 - 比较。然后从最左开始循环跟
pivot进行比较,如果遇到arr[j]比pivot小的数,就会把它跟arr[i]进行对换(swap是交换函数),并且进行i++。 - 分组。如此一直到
j == right的时候,i不一定也会到达right,这个时候可以确保的是i的位置以及i以下的位置的值都是比pivot小的,i+1就是临界墙,所以把i+1返回去进行下一轮比较。
1 | function quicksort(arr,left,right){ |
- 递归出口。来到主函数,首先可以知道递归出口是
left >= right。 - 分而治之。根据
partition获得得临界点,我们就可以把数组再分为两部分去进行partition,要注意临界点的数其实已经确定是比左边的都大,比右边的都小,所以它不需要再丢回去比较了。 - 最后返回的就是排序完成的数组。