php归并排序

<?php

  $arr = array(9,1,5,8,3,7,4,6,7);
   foreach ($arr as $key => $value) {
    echo $value."\n";
  }
  //一次归并算法
  function merge(&$arr,$s,$m,$e){
    $i=$s;
    $j=$m+1;
    $k=$s;
    $arr1 = Array();
    while($i<=$m && $j<=$e){
      if ($arr[$i]<=$arr[$j]) {
        $arr1[$k++]=$arr[$i++];
      }else{
        $arr1[$k++]=$arr[$j++];
      }
    }
    while($i<=$m){
      $arr1[$k++]=$arr[$i++];
    }
    while($j<=$e){
      $arr1[$k++]=$arr[$j++];
    }
    for($i=$s; $i<=$e; $i++){
      $arr[$i] = $arr1[$i];
    }
    
  }

  //一趟归并算法
  function mergeOne(&$arr,$n,$h){
    $i=0;
    while($i<=$n-(2*$h)+1){
      merge($arr,$i,$i+$h-1,$i+($h*2)-1);
      $i+=2*$h;
    }
    if($i<=$n-$h+1){
      merge($arr,$i,$i+$h-1,$n);
    }
  }
  //非递归
  function mergeSort(&$arr,$n){
    $h=1;
    while($h<$n+1){
      mergeOne($arr,$n,$h);
      $h=$h*2;
    }
  }
  //递归
  function mergeSort2(&$arr,$s,$e){
    if($s < $e){    
      $middle = floor(($s+$e)/2);
      mergeSort2($arr,$s,$middle);
      mergeSort2($arr,$middle+1,$e);
      merge($arr,$s,$middle,$e);
    }
  }
  //mergeSort($arr,count($arr)-1);
  mergeSort2($arr,0,count($arr)-1);
  echo "<br>";
  foreach ($arr as $key => $value) {
    echo $value."\n";
  }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值