python php 快速排序

#!/usr/bin/python
#coding=UTF-8
def partition(li,left,rigth):
    temp = li[left] #获取第一个值假定为列表的中间值
    while left < rigth: # 如果中间值的左边小于右边 则说明比较的值左边为空 则将值复还结束算法
        while left < rigth and temp <= li[rigth]: #从列表结尾开始循环比较右边的值
            rigth -= 1 #依次向左进一步 
        li[left] = li[rigth] #将找到的值直接写到列表最开始(左边) 因为temp <= li[rigth] 所以会出现 两个值相当的情况
        while left < rigth and temp >= li[left]:#从列表开头开始循环比较左边的值
            left +=1 #依次向右进一步 
        li[rigth]=li[left] #将找到的值直接写到列表最开始(右边) 因为temp >= li[left] 所以会出现 两个值相当的情况
    li[left] = temp
    return left

def quick_sort(li,left,rigth):#快速排序利用将列表分为左右两边的方式,分别进行递归比较排序
    if left < rigth:
        mid = partition(li,left,rigth) #获取中间的值
        quick_sort(li,left,mid-1) #循环调用 开始递归左边
        quick_sort(li,mid+1,rigth) #循环调用 开始递归右边


# 时间复杂度 最优情况为O(nlogn) 最坏情况为O(n^2) 如果第一次取得的值正好是最大或者最小的 那么会出现O(n^2) 解决办法是可以使用随机取第一个值的方法进行改进,不过只是将最坏情况的概率减小了,并不能解决此问题 

li = [5,7,4,6,3,1,2,9,8];
if __name__ == "__main__":
    quick_sort(li,0,len(li)-1)
    print li
    
________________________________

# php快速排序 因为python操作的是数组的地址 而PHP在传值的时候是把当前的值复制一份,因为递归是无法直接返回的,只能操作地址,所以这里需要传入数组地址
________________________________
//快速排序
function partition(&$li,$left,$right)
{
    $temp = $li[$left];

    while ( $left < $right) {
        //echo $right;echo "<br />";
        while ($left < $right &&  $li[$right] >= $temp) {
            //echo $right;echo "<br />";
            $right -=1;
        }
        $li[$left] = $li[$right];
        //var_dump($li);echo "<br />";
        //echo  $li[$left];exit;
        while ($left < $right && $li[$left] <= $temp) {
            $left +=1;
        }
        $li[$right] = $li[$left];
        //var_dump($li);echo "<br />";
        
    }
    $li[$left] = $temp;
    return $left;
    //$mid = round(count($li)/2);
    //return  $temp;
}
function quick_sort(&$li,$left,$right)
{
    if ($left < $right) {
        $mid = partition($li,$left,$right);
        //var_dump($mid);echo "<br />";
        quick_sort($li,$mid+1,$right);
        quick_sort($li,$left,$mid-1);
        //var_dump($li);echo "<br />";
    }

}
$li = [5,7,4,6,3,1,2,9,8];
$right = count($li)-1;
quick_sort($li,0,$right);
var_dump($li);

转载于:https://www.cnblogs.com/ikai/p/11604220.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值