传说中最快的....
跟归并类似,以图中为例, 取65为 pivot, 将其他数据分成两块,然后递归排序左边和右边,然后把三块的结果放到一个数组即完成.
选pivot对快速排序来说极其重要,会极大的影响快速排序是真快还是假快......
Cutoff为数据大小的一个限制点, 当所剩的待排数据少于Cutoff时,就没必要再用快速排序了,转为插入排序。
通过Median3函数获取pivot(取前中后3个点,进行排序,然后返回3个点中值在中间的值作为pivot,并通过将pivot放到right-1的位置,给后面的排序提供方便,这样的话下次排序的时候只需要计算left - right-2的数字。)
将数组分成两边,左边的值应小于pivot,右边的应大于pivot,代码中遍历时,如碰到左边大于pivot则跳出第一段while进入第二段,等到第二段出现小于pivot的情况时,则将第一段出现异常(大于pivot)的数交换到第二段出现异常(小于pivot)的位置。然后由此再对pivot两边的数组递归。
如果第一段的索引 i 大于 j了。则证明两边数组已经检测完一轮了。跳出循环。一次循环后需要将pivot放到i的位置,方便后面继续对单独的左右分组进行快排。由此 子集划分完毕。后面开始递归排序