排序算法-快速排序原理及PHP实现

我们知道php的sort函数可以用来对数组排序,且效率非常高,它内部使用的就是用c写的快速排序算法。

其时间复杂度可为O(nlogn),对应的空间复杂度可为O(n)。快速排序可实现理论最优效率。

根据基准F,将序列拆分为 <= F 和 > F 两块,然后再对每一块也执行同样的拆分,拆到最后每组只有一个或两个数,比较一下就好了,然后再倒回来把各个小块合并起来就是排好序的了,当然这需要用到递归,所以在实现的时候一定注意避免死循环。

5, 4, 7, 8, 2, 7, 8, 5, 6, 3

思路如下:

0、基准F:我们以第一个数为基准 5
右哨兵B:位置在最后一个索引位,值为 3,职责:找出 <= 基准的值
左哨兵A:位置在左边第二个索引位,第一个为基准;值为 4,职责:找出 > 基准的值

始终都是先操作右哨兵!!

1、B = 3 满足 <= F ,A = 4 不满足 > F ,A接着右移,A = 7 满足 > F,A和B互换:
	5, 4, 3, 8, 2, 7, 8, 5, 6, 7

3、B左移,B = 6 不满足 <= F ,A也不用比较了。

4、B左移一个位,B = 5 满足 <= F ,A 右移 A = 8 满足 > F ,A和B互换。
	5, 4, 3, 5, 2, 7, 8, 8, 6, 7

5、B左移,直到B移到 2 的位置,B = 2 满足 <= F,A 右移 撞到了 B,第一轮结束,F和B互换。
	2, 4, 3, 5, 5, 7, 8, 8, 6, 7

得到左,右两个序列
	2, 4, 3, 5, 5 和 7, 8, 8, 6, 7

使用递归,分别对着两个序列重复上面的操作。
此时,2 和 7 称为新的序列的基准。
于是,list = list左 + list右 = (list左 + list右) + (list左 + list右) = ......

调用递归就能完成排序,如果提示你内存超出了那肯定是存在死循环了,打印调试一下就知道了。

代码:https://gitee.com/phprao/sort/blob/master/quickSort.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值