算法入门之快速排序

快速排序原理:

快速排序先把等待排序的集合打乱顺序,把第一个元素作为基准元素,为第二个元素和最后一个元素分配两个指针i和j,如果a[i]小于基准元素则i++,如果a[j]大于基准元素则j--,这样把大于基准元素的a[i]和小于基准元素的a[j]互换,以此类推,最终把基准元素与a[j]相交换,就得到一个a[j]左侧全部小于a[j],右侧全部大于a[j]的一个近似有序数组,然后按照如上步骤重新寻找每个被a[j]分开的数组中的分隔点,最终得到有序数组。

在通用排序中,一般都会选取快速排序来解决问题。

具体实现算法如下;

<?php
function less($m, $n) {
    return $m < $n;
}

function exch(&$a, $i, $j) {
    $tmp = $a[$i];
    $a[$i] = $a[$j];
    $a[$j] = $tmp;
}

function partition(&$a, $lo, $hi) {
    $i = $lo;
    $j = $hi+1;
    while(true) {
        while(less($a[++$i], $a[$lo])) if($i == $hi) break;
        while(less($a[$lo], $a[--$j])) if($j == $lo) break;
        if($i >= $j) break;
        exch($a, $i, $j);
    }
    exch($a, $lo, $j);
    return $j;
}

function fastSort(&$a, $lo, $hi) {
    if($lo >= $hi) return;
    $j = partition($a, $lo, $hi);
    fastSort($a, $lo, $j-1);
    fastSort($a, $j+1, $hi);
}

$a = array(6, 4, 3, 9, 5, 2, 0, 8, 1, 7);
shuffle($a);
print_r($a);
fastSort($a, 0, 9);
print_r($a);
排序结果:

array(0,1,2,3,4,5,6,7,8,9);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值