快速排序,归并排序

来源:互联网 发布:数据库%号 编辑:程序博客网 时间:2024/05/18 15:27
  1. 快速排序
  2. <?php 
    function quicksort($str){ 
    if(count($str)<=1) return $str;//如果个数不大于一,直接返回 
    $key=$str[0];//取一个值,稍后用来比较; 
    $left_arr=array(); 
    $right_arr=array(); 
    for($i=1;$i<count($str);$i++){//比$key大的放在右边,小的放在左边; 
    if($str[$i]<=$key) 
    $left_arr[]=$str[$i]; 
    else 
    $right_arr[]=$str[$i]; 

    $left_arr=quicksort($left_arr);//进行递归; 
    $right_arr=quicksort($right_arr); 
    return array_merge($left_arr,array($key),$right_arr);//将左中右的值合并成一个数组; 
    }//以下是测试 
    $str=array(5,3,8,2,5,9,7,2,1,4,0); 
    print_r(quicksort($str)); 
    ?> 


  3. 归并排序(1)
  4. <?php  
  5.   
  6. /** 
  7.  * 归并排序 
  8.  */  
  9. function guiSort( $arr )  
  10. {  
  11.     // 计算数组里的个数, 如果只有一个成员, 直接返回  
  12.     $count = count$arr );  
  13.     if$count <= 1 )  
  14.     {  
  15.         return $arr;  
  16.     }  
  17.   
  18.     //如果成员很多, 那么对左边 归并, 对右边归并  
  19.     $mid = floor$count / 2 );  
  20.     $left = guiSort( array_slice$arr, 0, $mid ) );  
  21.     $right = guiSort( array_slice$arr$mid ) );  
  22.   
  23.     // 左半数组的大小, 右半数组的大小  
  24.     $leftLen = count$left );  
  25.     $rightLen = count$right );  
  26.   
  27.     //返回值保存的变量  
  28.     $ret = array();  
  29.     $li = 0;  
  30.     $ri = 0;  
  31.   
  32.     while( 1 )  
  33.     {  
  34.         // 如果左边全合并了, 则退出循环  
  35.         if$li >= $leftLen )  
  36.         {  
  37.             $flag = 'left';  
  38.             break;  
  39.         }  
  40.         // 如果右边全合并了, 则退出循环  
  41.         if$ri >= $rightLen )  
  42.         {  
  43.             $flag = 'right';  
  44.             break;  
  45.         }  
  46.   
  47.         //如果左边的数小, 则左边加入返回数组  
  48.         if$left$li ] <= $right$ri ] )  
  49.         {  
  50.             $ret[] = $left$li ];  
  51.             $li ++;  
  52.         } else  
  53.         {  
  54.             $ret[] = $right$ri ];  
  55.             $ri ++;  
  56.         }  
  57.   
  58.     }  
  59.   
  60.     if$flag == 'left' )  
  61.     {  
  62.         //如果首先合并完的是左边, 则把右数组剩余的都加到返回数组  
  63.         $ret = array_merge$retarray_slice$right$ri ) );  
  64.     } elseif$flag == 'right' )  
  65.     {  
  66.         $ret = array_merge$retarray_slice$left$li ));  
  67.     }  
  68.   
  69.     return $ret;  
  70. }  
  71.   
  72.   
  73. // 测试代码  
  74. $arr = range( 1, 100 );  
  75. shuffle( $arr );  
  76. var_dump( $arr );  
  77. $res = guiSort( $arr );  
  78. var_dump( $res );  
  79. 归并排序(2)
  80. $lista = array(3,8,4);$listb = array(5,6,2); print_r(mergeSort($lista, $listb)); function mergeSort($la,$lb) {    //sort two sub-lists    sort($la);    sort($lb);     $final = array();    //keep looping while the two lists both have elements    while($la && $lb){        //compare the first two values,choose the smaller one and insert to 'final'        if($la[0]<=$lb[0]){            $final[] = array_shift($la);        }else{            $final[] = array_shift($lb);        }    }     return array_merge($final,$la,$lb);} #######output##########Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 8 )


0 0