PHP数组排序

冒泡排序法

基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向小标较小的单元),就像水底的气泡一样逐渐向上冒。

function bubbleSort(&$arr){
       //这是一个中间变量;
       $temp=0;
       //把数组从小到大排列
 
       //外层循环,代表排序回合,6个数5个回合
       for($i=1;$i<=count($arr)-1;$i++){
           //内层循环,遍历每个回合的元素,每个回合会将最大的数放在下标最大的位置,所以下个回合少比较一个元素
              for($j=0;$j<count($arr)-$i;$j++){
                    
                     if($arr[$j]>$arr[$j+1]){
                         //值对换
                            $temp=$arr[$j];
                            $arr[$j]=$arr[$j+1];
                            $arr[$j+1]=$temp;
                     }
                   
              }
       }
}
      
       $myarr=array(0,5,-1,54,-2.3,12);
       //使用函数输出;
       bubbleSort($myarr);//传地址,操作等同
       print_r($myarr);

 结果:Array ( [0] => -2.3 [1] => -1 [2] => 0 [3] => 5 [4] => 12 [5] => 54 )

【注意:数组默认传递的是值,而不是地址(对象默认传递的是地址!)! 

 class my{
    var $a=5;
}
function aa($b){
    $b->a=52;
}
$n=new my();
aa($n);
print $n->a;】

选择式排序法

基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,。。。。。。第i次从R[i-1]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排序的有序序列。

function selectSort(&$arr){
       $temp=0;
       for($i=0;$i<count($arr)-1;$i++){
              //假设$arr[$i]就是最小的数;
              $minVal=$arr[$i];
              //记录认为的最小数的小标
              $minIndex=$i;
              for($j=$i+1;$j<count($arr);$j++){
                     //说明我们认为的最小值不是最小值
                     if($minVal>$arr[$j]){
                            $minVal=$arr[$j];
                            $minIndex=$j;
                     }
              }
              //最后交换
              $temp=$arr[$i];
              $arr[$i]=$arr[$minIndex];
              $arr[$minIndex]=$temp;
 
       }
}
       $myarr=array(0,5,-1,45,-12);
       //使用选择排序函数输出;
       selectSort($myarr);
       print_r($myarr);

结果:Array ( [0] => -12 [1] => -1 [2] => 0 [3] => 5 [4] => 45 )

 插入排序法

基本思想:把n个待排序的元素看成一个有序表和无序表,开始时有序表中只包含一个元素,无序列表中包含一个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

function insertSort(&$arr){

       //先默认下标是0的这个数是有序的,所以从1开始

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

              //$insertVal是准备插入的数

              $insertVal=$arr[$i];

              //准备先和下标是$insertIndex的元素比较

              $insertIndex=$i-1;

 

              //如果这个条件满足,说明还没有找到适当的位置

              while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){

                     //满足该条件时,把该数后移

                     $arr[$insertIndex+1]=$arr[$insertIndex];

                     //循环

                     $insertIndex--;

              }

              //这是已经找到适当的位置,则插入(这里可以继续优化!)

              $arr[$insertIndex+1]=$insertVal;

       }

}

 

$myarr=array(0,5,-1,45,-12);

//使用插入法排序

       insertSort($myarr);

       print_r($myarr);

 结果:Array ( [0] => -12 [1] => -1 [2] => 0 [3] => 5 [4] => 45 )

快速排序法

特点:当数据量很大时,可以快速的排列,得出结果;是这几种排序法中速度最快的一种方法;

缺点:占用内存大;

function quickSort($left,$right,&$array){

       $l=$left;

       $r=$right;

       $pivot=$array[($left+$right)/2];

       $temp=0;

 

       while($l<$r){

              while($array[$l]<$pivot) $l++;

              while($array[$r]>$pivot) $r--;

             

              if($l>=$r) break;

 

              $temp=$array[$l];

              $array[$l]=$array[$r];

              $array[$r]=$temp;

 

              if($array[$l]==$pivot)  --$r;

              if($array[$r]==$pivot)  ++$l;

       }

 

       if($l==$r){

              $l++;

              $r--;

       }

 

       if($left<$r)  quickSort($left,$r,$array);

       if($right>$l) quickSort($l,$right,$array);

}

 

//快速排序法

$array=array(-9,78,0,23,-567,89);

quickSort(0,count($array)-1,$array);

print_r($array);

结果:Array ( [0] => -567 [1] => -9 [2] => 0 [3] => 23 [4] => 78 [5] => 89 )

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值