算法学习--排序算法--快排

4 篇文章 0 订阅
4 篇文章 0 订阅

算法学习--排序算法--快排

快排算法

快速排序是系统中常用的排序方法,也是面试常考题目,快排的本质是利用空间解决时间问题,通过并发运算,解决运算耗时问题。快速排序本身需要比较的次数比冒泡会多,但是其递归的良好应用,使得排序效率极高。
具体做法(这里的做法是主要针对我自己的代码,与百度算法有一些区别):

  1. 从数组中取出关键数据,一般都是取第一个数据
  2. 将数组中的数据与关键数据进行对比,如果比关键数据大,则放入关键数组左侧,反之放在右侧
  3. 将左右两侧的数据再次进行第1、2步操作,直到所有数据排序完成

代码实现

//这是百度的排序示例,这里是直接对原数组进行排序,循环较多,而且不直观。我自己改变了一下,让他更容易理解
function qs($a, $s=0, $e=null) {
    if($e === null) {
        $e = count($a);
    }
    if($s >= $e) {
        return $a;
    }
     
    $j = $e-1; 
    $i = $s;
    $n = $a[$s];
    //$ac = $a;
    for(; $j>$i; $j--) {
        if($a[$j] < $n) {
            $t = $a[$i];
            $a[$i] = $a[$j];
            $a[$j] = $t;
            for($i++;$i<$j;$i++) {
                if($a[$i] > $n) {
                    $t = $a[$j];
                    $a[$j] = $a[$i];
                    $a[$i] = $t;
                    break;
                }
            }
        }
    }
    //printf("\n[%s], %s ~ %s [%s] %s-%s-%s", implode($ac, ','), $s, $e, implode($a, ','), $i, $j, $e);
    qs(&$a, $s, $i);
    qs(&$a, $i+1, $e);
    return $a;
}

//这是我的算法,下面的比较可以再简化
function quickSort($array = array())
{
    global $time;
    if(count($array) <= 1) {
        return $array;
    }

    $temp = $array[0];
    $array_left = $array_right = $array_current = array();
    foreach ($array as $item) {
        $time++;
        if ( $item < $temp) {
            $array_left[] = $item;
        }
        if ( $item > $temp) {
            $array_right[] = $item;
        }
        if ( $item == $temp) {
            $array_current[] = $item;
        }
    }
    $array_right = quickSort($array_right);
    $array_left = quickSort($array_left);
    return array_merge($array_left,$array_current,$array_right);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael·Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值