快速排序的思想,寻找一个轴位,比这个轴小的放到左边,比这个轴大的放到右边,然后分别再对两边进行如此的方法即可得到排序的数组。
这样说起来晦涩难懂,我们举个例子来实现。
例如数组:{13,19,9,5,12,8,7,4,21,2,6,11},选取末位11为轴,
第一次遍历得到:{13,19,9,5,12,8,7,4,21,2,6,11}
第二次遍历得到:{13,19,9,5,12,8,7,4,21,2,6,11}
第三次遍历得到:{9,19,13,5,12,8,7,4,21,2,6,11}
第四次遍历得到:{9,5,13,19,12,8,7,4,21,2,6,11}
第五次遍历得到:{9,5,13,19,12,8,7,4,21,2,6,11}
第六次遍历得到:{9,5,8,19,12,13,7,4,21,2,6,11}
第七次遍历得到:{9,5,8,7,12,13,19,4,21,2,6,11}
第八次遍历得到:{9,5,8,7,4,13,19,12,21,2,6,11}
第九次遍历得到:{9,5,8,7,4,13,19,12,21,2,6,11}
第十次遍历得到:{9,5,8,7,4,2,19,12,21,13,6,11}
第十一次遍历得到:{9,5,8,7,4,2,6,12,21,13,19,11}
最后我们把原来的轴11与中间位置12交换得到:{9,5,8,7,4,2,6,11,21,13,19,12}
我们开始排列两边,{9,5,8,7,4,2,6} 和{21,13,19,12}
我们选取6和12分别为两边的轴,开始新的一轮遍历,
第一次遍历:{9,5,8,7,4,2,6} , {21,13,19,12}
第二次遍历:{5,9,8,7,4,2,6} , {21,13,19,12}
第三次遍历:{5,9,8,7,4,2,6} , {21,13,19,12}
第四次遍历:{5,9,8,7,4,2,6} , 无
第五次遍历:{5,4,8,7,9,2,6} , 无
第六次遍历:{5,4,2,7,9,8,6} , 无
最后我们把原来的轴6和中间位置7交换,得到:{5,4,2,6,9,8,7} 。把原来的轴12和中间位置21交换,得到:{12,13,19,21}
我们分成了小数组:{5,4,2} 和{9,8,7} 和{13,19,21},分别以2和7,21为轴进行新一轮的遍历
第一次遍历:{5,4,2} , {9,8,7} , {13,19,21} 注意:13和13自己进行交换,
第二次遍历:{5,4,2} , {9.8.7} , {19,13,21}
最后我们把原来的轴2和中间位置5交换,得到:{2,4,5}。把原来的轴7和中间位置9交换,得到:{7,8,9}。把原来的轴21和中间位置21交换,得到{19,13,21}
我们分成小数组:{2,4}和{7,8}和{19,13},分别以4,8,13为轴,开始新的一轮遍历。
第一次遍历:{2,4} , {7,8} , {19,13}
这里已经结束遍历,原来的轴和中间位置交换,得到{2,4} {7,8} {13,19} 。 自此遍历结束,得到了顺序的数组。
注意:(1)这里的“中间位置”,并不是说的位置上的中间,而是指的是轴的中间位置,也就是说,这个中间位置是左边的比轴小,右边的比轴大!!!
(2)这里的红色标志表示交换,如果是有一个红色的表示自己和自己交换!!!
程序员还是用代码来说事,这么多文字,大家可能会看不下,那就看下代码,不明白的可以对照上面的顺序来屡屡。
附上另一种方法:
快速排序主要是掌握方法,其中获取中间位置的算法是核心算法,这里是排序的关键,做什么事情势必要亲身尝试,哪怕错了可以重头再来!!!