快速排序基本思想及实现
今天给大家分享快速排序是如何实现的,希望大家看了这篇文章能够有所收获。
基本思想
快速排序是通过一趟排序将要排序的数据分割成两部分,其中一部分数据比另一部分数据都要小,再按照此方法递归进行,最终实现整个数据变成有序系列。
实现步骤
将数组 [3,5,8,1,2,9,4,7,6] 从小到大排序,
准备工作
找一个基准数B(随机选择,这里为了方便演示,选择最右边的数字最基准数),这里找到基准数B是最右边的数字6,再找最左边的数字3表示为左标记L,最右边的数字7表示为右标记R,准备工作就绪,此时数组指向如下:
3 | 5 | 8 | 1 | 2 | 9 | 4 | 7 | 6 |
---|---|---|---|---|---|---|---|---|
L | R | B |
步骤①:首先将L向右移动,当L>B时,L停止移动,数组顺序不变,此时:
3 | 5 | 8 | 1 | 2 | 9 | 4 | 7 | 6 |
---|---|---|---|---|---|---|---|---|
L | R | B |
步骤②:然后将R像左移动,当R<B时,R停止移动,数组顺序不变,此时:
3 | 5 | 8 | 1 | 2 | 9 | 4 | 7 | 6 |
---|---|---|---|---|---|---|---|---|
L | R | B |
步骤③:当两标记都停止移动时,交换两标记所指的值(即数组元素),此时8和4替换位置:
注意:思考这时候问什么要交换?因为我们的目标是将比基准数B小的值移到B左边,比B大的值移到B右边,L和R之所以停止移动,是遇到了不满足目标的值,此时将两者交换,就又能向目标更近一步了。
3 | 5 | 4 | 1 | 2 | 9 | 8 | 7 | 6 |
---|---|---|---|---|---|---|---|---|
L | R | B |
步骤④:交换过后,再如此循环步骤①②③,此时:
3 | 5 | 4 | 1 | 2 | 9 | 8 | 7 | 6 |
---|---|---|---|---|---|---|---|---|
L R | B |
步骤⑤:当L和R触碰到一起时,停止移动,并将L和R所指的数字与B交换,此时:
3 | 5 | 4 | 1 | 2 | 6 | 8 | 7 | 9 |
---|---|---|---|---|---|---|---|---|
L R | B |
我们得知:L左标记的作用是找到比B小的元素,R 的作用是找到比B大的元素,此时:数字6完成排序,下一轮就不带它了。以上步骤①到⑤,完成了第一轮交换,我们可以按照递归的思想,将基准点6左右两侧数字再进行一轮交换
3 | 5 | 4 | 1 | 2 | 6 | 8 | 7 | 9 |
---|---|---|---|---|---|---|---|---|
完成排序 |
步骤⑥:选择基准数B,左标记L,右标记R,如下:
注:打√表示完成排序
3 | 5 | 4 | 1 | 2 | 6 | 8 | 7 | 9 |
---|---|---|---|---|---|---|---|---|
L | R | B | √ |
接着,以此类推,(不熟悉交换步骤可以滑上去看步骤①到⑥)1和3交换
1 | 5 | 4 | 3 | 2 | 6 | 8 | 7 | 9 |
---|---|---|---|---|---|---|---|---|
L | R | B | √ |
1 | 2 | 4 | 3 | 5 | 6 | 8 | 7 | 9 |
---|---|---|---|---|---|---|---|---|
L R | B | √ |
上面第二轮完成,2完成排序,1也完成排序下面进行第三轮:
1 | 2 | 4 | 3 | 5 | 6 | 8 | 7 | 9 |
---|---|---|---|---|---|---|---|---|
√ | √ | R | L B | √ |
5完成排序,最后
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ |