3.2快排算法
快排的重点是划分,归并的重点是合并
快排:中间划一刀,左右都做排序,最后合并
归并:分组后对每个分组进行排序,最后合并所有分组
快排之单向扫描分区法:
设置两个指针和一个主元(相当于做一个标记,标记哪个元素都行),第一个指针放在数组最左边,它左边的数小于等于主元,第二个指针放在数组最右边,它右边的数大于主元。扫描规则是从左边的指针开始扫描,如果指向的数小于等于主元则首指针右移,如果大于主元则将这个数和尾指针指向的数交换,尾指针右移。当首尾指针相遇的时候,还能执行一次扫描,此时
快排之双向扫描分区法:
选定主元后,左右指针**同时**向中间靠拢,左边遇到大于主元的就与右指针交换,然后左指针右移一位,右指针与主元比较,小于等于主元就与左指针交换,然后左移一位。
当循环结束后,两个指针的位置会变成如图所示,然后将主元和右指针互换(主元是等于,右指针是小于等于,只要左半部分全都是小于等于就行),最后返回右指针,这样就得到了一左一右两个分组,对这两个分组重复调用快排算法即可
代码实现:
快排之三向扫描分区法:
equal指针用于标记相等的数组开始的位置,s指针继续往后扫描,规则见左下
适用于数组中跟主元相等的元素较多时,将跟主元相等的元素放在同一个区间内,然后主元和e前一个元素进行交换,最后返回一个【主元的位置,b指针的位置】的数组