快排的基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后对左右子序列重复该过程,直到所有元素都排列在相应位置上为止。举个例子说明:
对于这个数组来说,
1:选最右边的位置(keyIndex)的值为基准值(key);
2:定义两个索引begin和end;
3:先:begin从左向右找比基准值大的值的位置;
4:然后:end从右向左找比基准值小的值的位置;(为什么先begin后end后面会说)
5:将begin和end位置处的值进行对换;
6:继续重复3,4,5步骤;直至begin等于end时结束;
找位置
交换
begin继续走,此时等于end,结束循环
将begin处的值和keyIndex处的值交换
交换完之后,已begin处为中心,分为两个子序列,begin左边一个,begin右边一个,然后分别对两个子序列重复上述的步骤,直至最后,就可以成功排序这个数组,
begin左边序列,此时的end1可由上面返回的begin值得到,为begin-1
begin右边序列,此时得begin2可由上面返回的begin值得到,为begin+1
相应得代码如下:
为什么先begin后end:
先让begin走,是为了确保最后停下或跳出循环的位置处的值是大于key的,这样直接就可以将begin处的值与keyIndex处的值进行交换,使得最终形成左右子序列。
例如:
此处begin和end处值交换后,若让end先找,则end会在值为4的位置处与begin相遇停下
此时跳出循环,交换begin和keyIndex处的值后,就不符合左右子序列分别小于和大于key值,若让begin先走:
则会在值为7的位置处停下,跳出循环后交换begin和keyIndex处的值,即符合要求。
本文章是按最右边值为基准值来说明,若按最左边为基准值也可,步骤类似,只是这时是先end找,然后再begin找,原因与此类似。并且这里的快速排序还没有优化,若是已经是有序或基本有序的序列,则会很慢,即基准值若选的是本数组中最大或最小值,则效率会很慢,所以要选合适的基准值根据三数取中法,后续更新,谢谢。