首页 > 代码库 > 快速排序的三种实现方式

快速排序的三种实现方式

 

实现时都是分治+递归的思路.

 

第一种 是 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

 

 

暂时先写个原理思路,以后有机会再补上助于理解的图片和实现代码.

 

快速排序的三种实现方式