最近重温了一下快速排序,我觉得果然重复就是力量,自己越来越懂了,所以我要好好总结一下,如果不总结,我的脑子就算懂了还是凌乱的。
总结按照举例并逐步分析,原理,总结的顺序来的。
下面我就来以实战论英雄;
待排序的数组为:
快速排序就像是有两个小孩子,一个在最左边,一个在最右边,对没错,就是那种,我住长江头君住长江尾的感觉。让我们看看他们的最开始的家,是的,没错,
那要怎么才能完成排序呢?首先,我要按照升序排,从小到大来排的
第一步,把第一个数作为基准点,即5,把它作为标准,排序的过程就是不停地找基准点所在的位置的过程。
现在基准点5所在的是第一个位置,但是要靠它分出来两股数据,一边都比它小,一边都比它大,所以我们要怎么做呢?
找j小于基准数5的,i找到比基准数大的。
首先,一定要从j开始走,23比5大,所以往前走,直到它找到比5小的数字
那么不停的从最右往左找,就发现,0要比5小,所以就停下来,不动了。这次开始i动了,i要从左往右找,找到比基准数5大的,那么一直找就发现,7比基准数5大,就停在了7的位置(如上图)
这是,第一次交换数据,i和j交换,那么交换后的数据为
现在,基准点的准确位置还没有找到,所以继续前行,还是先让j继续找比基准点5小的,发现1比5小,那么停在1的位置不懂,接着,i开始往右走,发现9比5大,同样符合要求,那么,再一次双方交换数据,其结果为:
那么现在,作为基准点,还是不能很好的将整个数组划分为两股势力,一方都比基准点小,一方都比基准点大,所以,j要继续往左走,走到8,8>5,不能停,那么继续走就到了i所在的1,1<5,所以应该停下来,那么i,j相遇的地方,就是基准点5应该在的地方,所以,交换数据8,和数据5的位置,则有以下结果:
那么,第一轮排序到这里就算是完成了。
第二轮排序怎么开始呢?
既然我们找到了基准点,将一个大的数组成功分成了两股势力,左边都是比5小的,右边都是比5大的,那么就在这两个分区里面继续重复第一轮的操作
一部排序方式
还是老方法,把为首的1作为基准点,找到其合适的位置,i,j位置也如之前,j要小于1,i>1
开头还是j先走,发现0小于基准点1,那么停下不动,i走,发现3大于1,交换位置:
还没有找到基准点的正确位置,继续找,j向左走,发现2>1,不能停,继续走,发现0大于1,那么停下来发现i,j再次相遇,既然相遇,这个位置就是基准点所在位置了,交换0,1
于是一部的顺序排好了:
二部的排序同样也是如此,因此最终的排序结果是这样的:
那么逐步分解就到这里了
总结:慢慢学习,再笨也会有聪明的时候
PS:代码过后补充吧