【算法与数据结构必备】PHP常用排序算法:冒泡,快速排序,插入排序(一维数组)

冒泡排序:两两交换数值,最小值在最左边,就如最轻气泡在最上边。对整列数两两交换一次,最小数在最左边,每次都能得一个在剩下数中最小数,“冒”出来数组成一个有序区间,剩下值组成一无序区间,且有序区间中每一元素值都比无序区间小。

快速排序:基准数,左右二个数组,递归调用,合并。

插入排序:排序区间分成二部分,左边有序,右边无序,从右区间取第一个元素插入左区间,若此元素比左边区间最右边元素大,留在原处,若此元素比左边区间最右边元素小,则插在最右边元素原位置,同时最右边元素右移一位,计算器减一,重新和前面元素比较,直到前面元素比要插入元素小为止,重复上述步骤。

注意区间端点值处理,及数组第一个元素下标为0.

<?php

//PHP常用排序算法

function bubblesort ($array)

{

$n = count ($array);

for ($i = 0; $i < $n; $i++)

{

for ($j = $n - 2; $j >= $i; $j--) //[0,i-1] [i,n-1]

{

if ($array[$j] > $array[$j + 1])

{

$temp = $array[$j];

$array[$j] = $array[$j + 1];

$array [$j + 1] = $temp;

}

}

}

return $array;

}

$array = array (3,6,1,5,9,0,4,6,11);

print_r (bubblesort ($array));

echo '<hr>';

function quicksort ($array)

{

$n = count ($array);

if ($n <= 1)

{

return $array;

}

$key = $array['0'];

$array_r = array ();

$array_l = array ();

for ($i = 1; $i < $n; $i++)

{

if ($array[$i] > $key)

{   

$array_r[] = $array[$i];

}

else

{

$array_l[] = $array[$i];

}

}

    $array_r = quicksort ($array_r);

    $array_l = quicksort ($array_l);

$array = array_merge ($array_l, array($key), $array_r);

return $array;

}

print_r (quicksort ($array));

echo '<hr>';

function insertsort ($array)

{

$n = count ($array);

for ($i = 1; $i < $n; $i++) //[0,i-1] [i,n]

{

$j = $i - 1;

$temp = $array[$i];

while ($array[$j] > $temp)

{

$array[$j + 1] = $array[$j];

$array[$j] = $temp;

$j--;

}

}

return $array;

}

print_r (insertsort ($array));

?>

----------------------------------------------------------------------------------------------

【基本算法】

假设有一个数组,需要找出某个值在该数组中的位置。

<?
//二分查找
function bin_sch($array$low$high$k){
    if (
$low <= $high
){
        
$mid intval(($low+$high)/2
);
        if (
$array[$mid== $k
){
            return 
$mid
;
        }elseif (
$k $array[$mid
]){
            return 
bin_sch($array$low$mid-1$k
);
        }else{
            return 
bin_sch($array$mid+1$high$k
);
        }
    }
    return -
1
;
}

//顺序查找
function seq_sch($array$n$k){
    
$array[$n$k
;
    for(
$i=0$i<$n$i
++){
        if(
$array[$i]==$k
){
            break;
        }
    }
    if (
$i<$n
){
        return 
$i
;
    }else{
        return -
1
;
    }
}


?>

测试代码:
array.txt 文件里面包含了一百万条类似 2,3,4,5 这样的数据,下面通过顺序查找和二分查找来确定速度。

//二分查找
<?php
set_time_limit
(0
);
$array 
array();
$file file_get_contents("./array.txt"
);

$array explode(","$file);
sort($array
);

$st time
();
$k 43

$n count($array
);
$r bin_sch($array0$n-1$k); 
$et time();

$t $et-$st
;
echo 
"Process time: "$t ."/s"
;
?>

以上输出: Process time: 0/s

//顺序查找
<?php
set_time_limit
(0
);
$array 
array();
$file file_get_contents("./array.txt"
);
$array explode(","$file);

$st time
();
$k 43

$n count($array
);
$r seq_sch($array$n$k
); 
$et time
();

$t $et-$st
;
echo 
"Process time: "$t ."/s";
?>

以上输出结果:Process time: 9/s

 
上面轻易就能够看出谁的效率高了。

【算法改进】

<?
//二分查找(递归消除)
function bin_sch($array$n$k
){
    
$low 0
;
    
$high $n-1
;
    while(
$low <= $high
){
        
$mid intval(($high-$low)/2
);
        if (
$array[$mid== $k
)
            return 
$mid
;
        elseif (
$k $array[$mid
]){
            
$high $mid 1
;
        }else{
            
$low $mid 1
;
        }
    }
    return -
1
;
}

//顺序查找(改进版)
function seq_sch($array$n$k
){
    
$array[$n$k
;
    for(
$i=0$i
++){
        if(
$array[$i]==$k
){
            break;
        }
    }
    if (
$i<$n
){
        return 
$i
;
    }else{
        return -
1
;
    }
}

?>

能看出上面两个函数做了什么改变吗?效率提升了多少?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值