排序算法的php实现

插入排序原理:给定一个无序数组a,假设元素a[0]-a[i-1]有序,则从a[i]开始和数组a[0]-a[i-1]之间的元素进行比较,将a[i]插入到合适的位置,从而保证a[0]-a[i]有序,以此类推,将整个数组排序。插入排序算法的最大时间复杂度是O(n^2),插入排序适合基本有序的数组结构,它的最小的时间复杂度接近O(n),那么为了尽量减少插入排序的时间复杂度,因此引入了希尔排序,希尔排序是插入排序的优化方案,它引入一个增量的概念,使数组按照增量增长有序,依次减少增量到1,使整个数组有序,以此来减少时间复杂度,希尔排序的时间复杂度是O(nlogn),并且插希尔排序不是稳定的排序算法.

插入排序

function insertSort(array &$a)
{
    $length = count($a);
    for($i == 1; $i < $length; ++$i) {
        if($a[$i] < $a[$i-1]) {
            $tmp = $a[$i];
            for($j = $i; $j > 0; --$j) {
                if($a[$j-1] > $tmp){
                    $a[$j] = $a[$j-1];
                } else {
                    break;
                }   
            }   
            $a[$j] = $tmp;
        }   
    }   
}

希尔排序

function shellSort(array &$a, $incre)
{
    $length = count($a);
    while(true) {
        for($i = $incre; $i < $length; ++$i) {
            if($a[$i] < $a[$i-$incre]) {
                $tmp = $a[$i];
                for($j = $i -$incre; $j > 0; $j -= $incre) {
                    if(isset($a[$j]) && $a[$j] > $tmp) {
                        $a[$j+$incre] = $a[$j];
                    } else {
                        break;
                    }
                }
                $a[$j+$incre] = $tmp;
            }
        }
        $incre = intval($incre/2);
        if($incre < 1) {
            break;
        }
    }
}

$a = [0,20,7,-1,6,2,6,2,8,9,0,1];
shellSort($a, 3);

运行结果:0,-1,0,1,2,2,6,6,7,8,9,20

快排:

function qSort(array &$a, $low, $high)
{   
    if($low >= $high) {
        return;
    }
    $index = partition($a,$low,$high);
    qSort($a,$low,$index-1);
    qSort($a,$index+1,$high);
}

//元素相互赋值比交换效率
function partition(array &$a, $low, $high)
{
    $temp = $a[$low];
    while($low < $high) {
        while($low < $high && $a[$high] >= $temp) { 
            --$high;
        }   
        $a[$low] = $a[$high];
        while($low < $high && $a[$low] <= $temp) {
            ++$low;
        }   
        $a[$high] = $a[$low];
    }   
    $a[$low] = $temp;
    return $low;
}

$a = [0,20,7,-1,6,2,6,2,8,9,0,1];
qSort($a, 0, count($a) -1);

var_dump(implode(',', $a));

结果展示:-1,0,0,1,2,2,6,6,7,8,9,20

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值