php 算法怎么做,PHP实现八大算法

标签:

1299687-20181218114737435-1857002884.png

交换函数:注意要按引用传递,否则无法真正交换两个数的值

function exchange(&$a, &$b){

$temp = $a;

$a = $b;

$b = $temp;

}

1、直接插入算法

//第一种实现

function insert_sort($arr){

for ($i = 0; $i < count($arr)-1; $i++){

for($j = $i+1; $j > 0; $j--){

if($arr[$j] > $arr[$j-1]){

exchage($arr[$j], $arr[$j-1]);

}

}

}

return $arr;

}

//第二种实现

function insert_sort($arr){

for ($i = 0; $i < count($arr)-1; $i++){

$j = $i + 1;

while($j > 0){

if($arr[$j] > $arr[$j-1]){

exchage($arr[$j], $arr[$j-1]);

}

$j--;

}

}

return $arr;

}

2、希尔排序算法【暂缺】

3、直接选择排序算法

function select_sort($arr){

for($i = 0; $i < count($arr); $i++){

$key = $arr[$i];

$n = $i;

for($j = $i+1; $j < count($arr); $j++){

if($key > $arr[$j]){

$key = $arr[$j];

$n = $j;

}

}

$arr[$n] = $arr[$i];

$arr[$i] = $key;

}

return $arr;

}

4、堆排序算法【暂缺】

5、冒泡排序算法

//第一种

function bubble_sort($arr){

for($i = 0; $i < count($arr)-1; $i++){

for($j = count($arr)-1; $j > $i; $j--){

if($arr[$j-1] < $arr[$j]){

exchage($arr[$j], $arr[$j-1]);

}

}

}

return $arr;

}

//第二种

function bubble_sort($arr){

for($i = 0; $i < count($arr)-1; $i++){

$j = 0;

while($j < count($arr)-1-$i){

if($arr[$j] < $arr[$j+1]){

exchage($arr[$j], $arr[$j-1]);

}

$j++;

}

}

return $arr;

}

6、快速排序算法

function quick_sort(&$arr, $p, $r){

if($p < $r){

$q = partition($arr, $p, $r);

quick_sort($arr, $p, $q-1);

quick_sort($arr, $q+1, $r);

}

}

function partition(&$arr, $p, $r){

$i = rand($p, $r); //实现随机化快排

exchange($arr[$i], $arr[$r]);

$n=$p-1;

for($m = $p; $m < $r; $m++){

if($arr[$m] < $arr[$r]){

++$n;

exchange($arr[$m], $arr[$n]);

}

}

exchange($arr[$n+1], $arr[$r]);

return $n+1; //n位上的元素,一经排序,则已固定

}

7、归并排序算法【注意:数组按值传输】

function merge_sort(&$A, $p, $r){

if($p < $r){

$q = floor(($p + $r)/2);

merge_sort($A, $p, $q);

merge_sort($A, $q+1, $r);

merge($A, $p, $q, $r);

}

}

//第一种

function merge(&$A, $p, $q, $r){ //哨兵牌法

$n1 = $q - $p + 1;

$n2 = $r - $q;

for($i = 0; $i < $n1; $i++){

$L[$i] = $A[$p+$i];

}

for($j = 0; $j < $n2; $j++){

$R[$j] = $A[$q+$j+1];

}

//防止越界(哨兵)

$L[$n1] = $R[$n2] = PHP_INT_MAX;

$i = $j = 0;

for($k = $p; $k <= $r; $k++){

if($L[$i] <= $R[$j]){

$A[$k] = $L[$i];

$i++;

}else{

$A[$k] = $R[$j];

$j++;

}

}

}

//第二种

function merge(&$A, $p, $q, $r){

$n1 = $q - $p + 1;

$n2 = $r - $q;

for($i = 0; $i < $n1; $i++){

$L[$i] = $A[$p+$i];

}

for($j = 0; $j < $n2; $j++){

$R[$j] = $A[$q+$j+1];

}

$i = $j = 0;

$k = $p;

while($i

if($L[$i] <= $R[$j]){

$A[$k++] = $L[$i++];

}else{

$A[$k++] = $R[$j++];

}

}

for(; $i

$A[$k++] = $L[$i];

}

for(; $j

$A[$k++] = $R[$j];

}

}

8、基数排序算法【暂缺】

转载自:https://www.cnblogs.com/zixuanfy/p/7617451.html

标签:

来源: https://www.cnblogs.com/jierong12/p/10136242.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值