简介
自从用上了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
,要注意临界点的数其实已经确定是比左边的都大,比右边的都小,所以它不需要再丢回去比较了。 - 最后返回的就是排序完成的数组。