算法绘本-快速排序

快速排序也使用了分治法的思想,对给定的一组元素,首先用两个指针L,R分别指向最左边和最右边的元素,然后取出最左边的元素,从右边的指针指向的元素开始,和取出的元素比较,如果大于取出的元素,则放右边(如果本来就在右边,则不动),右边的指针向左移动再比较,如果小于取出的元素,则将这个元素放到左边(如果本来就在左边,则不动)。如果位置动了,则切换指针移动一位比较。当两个指针重合的时候,将取出的作为比较的元素放到重合的位置,这一轮比较就结束了,然后需要对重合指针左边的元素和右边的元素分别做上述操作,直到完成排序。

举个例子,假设有一组数6,2,8,1,0,9,4

image-20240417205440936.png

首先用两个指针L,R分别指向这组数的最左边和最右边

image-20240417205630339.png

然后取出左边第一个数字作为比较的数字,指针L指向的位置空出来了

image-20240417205712978.png

然后从指针R指向的数字4开始和数字6比较

image-20240417205808886.png

因为4比6小,所以将4放到左边L指向的空位置上

image-20240417210258255.png

R指针指向的元素移动了,所以要切换到指针L向右移动一位,用指针L指向的2和数字6比较

image-20240417210405063.png

因为2比6小,所以2放左边,2本来就在左边,所以2位置不动,继续将指针L向右移动一位,用指针指向的8和数字6比较

image-20240417210600504.png

因为数字8比数字6大,所以要将数字8放右边,放到指针R指向的空位置上

image-20240417210826101.png

指针L指向的元素移动了,所以要切换到指针R向左移动一位,用指针R指向的数字9和数字6比较

image-20240417210930391.png

因为数字9大于数字6,所以数字9需要放右边,数字9本来就在右边,所以位置不动,让指针R继续左移一位,用指针R指向的数字0和数字6比较

image-20240417211112498.png

因为数字0小于数字6,所以需要将数字0放到指针L指向的空位置

image-20240417212143856.png

然后切换到指针L向右移动一位,用指针L指向的数字1和数字6比较

image-20240417212702821.png

因为数字1比数字6小,所以数字1放左边,继续将指针L右移一位

image-20240417213447443.png

这时候指针L和指针R重合了,将比较的数字6放到指针指向的空位置

image-20240417213539330.png

这样第一轮排序就结束了

接下来对数字6左边的数字进行排序。同样的,指针L,R分别指向最左边和最右边的数字

image-20240417221958619.png

将最左边的数字4取出来,作为比较的数字

image-20240417222133198.png

从指针R指向的数字1开始和数字4比较

image-20240417222444581.png

因为1小于4,所以将1放到指针L指向的位置

image-20240417222515227.png

指针L向右移动一位,用指针L指向的数字2与数字4比较

image-20240417222559893.png

因为2比4小,所以位置不动,继续向右移动指针L,用指针L指向的数字0和数字4比较

image-20240417222703578.png

因为0小于4,所以位置不动,继续向右移动指针L,这时候指针L和指针R的位置重合了

image-20240417222743465.png

将数字4放到指针重合的空位置

image-20240417222813128.png

这一轮结束

接下来,对数字4左边的数字进行排序,将指针L和指针R分别指向最左边的数字1和最右边的数字0

image-20240417222933968.png

取出最左边的数字1作为比较的数字

image-20240417223032394.png

从指针R指向的数字0开始和1比较

image-20240417223103870.png

因为数字0比数字1小,所以将1放到指针L指向的位置

image-20240417223138021.png

然后指针L向右移动一位,用指针L指向的数字2和1比较

image-20240417223216897.png

因为数字2比1大,所以将2放到指针R指向的位置

image-20240417223246001.png

然后指针R向左移动一位

image-20240417223432993.png

这时候指针L和指针R重合了,所以将数字1放到指针重合的位置

image-20240417223515466.png

数字1左边和右边都只有一个数字,所以无需再对其排序了。前面数字4右边没有数字,所以无需对数字4右边排序,加上数字4,就是0,1,2,4,已经排好序了

image-20240417223629980.png

再加上数字6,就是0,1,2,4,6

image-20240417223845913.png

然后再对数字6右边的9和8执行同样的操作,指针L,R分别指向最左边的数字9和最右边的数字8

image-20240417224013100.png

将最左边的数字9取出来,作为比较的数字

image-20240417224123830.png

从指针R指向的数字8开始,和数字9比较

image-20240417224152463.png

因为数字8小于数字9,所以将数字8放到指针L指向的位置

image-20240417224220988.png

指针L向右移动一位

image-20240417224243683.png

这时候指针L和指针R重合了,所以将数字9放到指针重合的位置

image-20240417224320169.png

数字9左边只有一个数字,右边没有数字,所以排序完成了,加上前面排序好的数字,所以最终的结果是

image-20240417224422815.png

总结
  • 快速排序的最优时间复杂度和平均时间复杂度都是O(nlogn),最坏时间复杂度是O(n^2)
  • 快速排序的最优空间复杂度是O(logn),最坏空间复杂度O(n)
  • 40
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值