实现时都是分治+递归的思路.
第一种 是 i 、j 找到的元素互换法, 如基准是第一个元素,那么j从后往前找比基准小的元素, 找到后接着让i从前往后找比基准大的元素,找到后让i j位置处的元素互换位置, 接着j再从后往前找比基准小的元素,直到 i == j 然后将相等位置处的元素和基准位置处的元素互换,至此完成一轮排序.
注意如果基准是第一个元素,那么一定要先从后往前扫描,因为这样才能保证i j 相等位置处的元素一定小于基准位置处的元素
一轮排序结束后返回 当前i 或j的值用于递归.
这种方法详细请参见:http://developer.51cto.com/art/201403/430986.htm
第二种是挖坑填数法,如基准是第一个元素,因为被一个变量记录了,那么可以看成第一个位置处的元素已经被挖出,有了一个坑, 此时j从最后一个元素处开始找比基准小的元素,
找到后就把那个元素的值赋给第一个位置处,可以看成第一个位置处的坑被填上了, 但是找到的那个元素的位置处又有了一个新坑,紧接着就是i++找比基准大的元素,不断挖新坑补上一个旧坑,然后直到i == j 把基准的值(有一个变量记录住了)补到这个有坑的位置上(这个位置的值赋给了上一个旧坑) 至此一轮排序结束.
这种方法详细请参见:http://blog.csdn.net/morewindows/article/details/6684558
第三种是不断和基准换位置法,这种和第二种类似,只是交换的次数更多,效率更低,原理就是如基准是第一个元素,那么j找到的元素和基准换位置,然后i找到的元素还是和基准当前所在位置互换,直到i ==j . 结束一轮排序
这种方法是每次找到符合的元素要执行2次赋值操作,而挖坑填数法除了最后一次执行了2次赋值操作,其它每次都是执行一次赋值操作.即把新坑的值赋给旧坑.
这种方法详细请参见:https://jingyan.baidu.com/article/d45ad148905ccf69552b80d9.html
暂时先写个原理思路,以后有机会再补上助于理解的图片和实现代码.