算法-----排序

 

一、排序

    有个数组需要排序:$arr = array(3,5,8,4,9,6,1,7,2);

    首先我们可以用API方法给其排序:

  1. sort() - 以升序对数组排序
  2. rsort() - 以降序对数组排序
  3. asort() - 根据值,以升序对关联数组进行排序
  4. ksort() - 根据键,以升序对关联数组进行排序
  5. arsort() - 根据值,以降序对关联数组进行排序
  6. krsort() - 根据键,以降序对关联数组进行排序

然后就是算法排序:

①冒泡算法:

索引值i处的值与后边的所有值比较,若符合条件就替换

//冒泡排序  

function BubbleSort($arr){  

    $length = count($arr);  

    if($length<=1){  

        return $arr;  

    }  

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

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

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

                $tmp = $arr[$j];  

                $arr[$j] = $arr[$j-1];  

                $arr[$j-1] = $tmp;  

            }  

        }  

    }  

    return $arr;  

}  

②快速排序:

设置一个枢轴与左右两个数组,让这个枢轴与其他数对比,按照大小分别放入左右组中。在该函数中内部递归排序再次左右分组,最终分为一个数组只有一个值,合并左,枢轴,右三部分。

​
//快速排序  

function QSort($arr){  

    $length = count($arr);    

    if($length <=1){  

        return $arr;  

    }  

    $pivot = $arr[0];//枢轴  

    $left_arr = array();  

    $right_arr = array();  

    for($i=1;$i<$length;$i++){//注意$i从1开始0是枢轴  

        if($arr[$i]<=$pivot){  

            $left_arr[] = $arr[$i];  

        }else{  

            $right_arr[] = $arr[$i];  

        }  

    }  

    $left_arr = QSort($left_arr);//递归排序左半部分    1,2,3,5,6

    $right_arr = QSort($right_arr);//递归排序右半部份8  9,10

    return array_merge($left_arr,array($pivot),$right_arr);//合并左半部分、枢轴、右半部分  

}  


​

③插入排序

索引值i的值与其前边的值作比较,符合条件的就把前边的值赋给该索引位置,按照这个步骤一直往前走,最后把原来i处的值与最后一步的值实现交换。(与冒泡相反)

//插入排序  

$arr = array(3,5,8,4,9,6,1,7,2);

function InsertSort($arr){  

    $length = count($arr);  

    if($length <=1){  

        return $arr;  

    }  

    for($i=1;$i<$length;$i++){  

        $x = $arr[$i];       

        $j = $i-1;           

        while($j>=0&&$x<$arr[$j] ){     

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

            $j--;  

        }  

        $arr[$j+1] = $x;     

    }  

    return $arr;  

}     

echo '插入排序:';  

echo implode(' ',InsertSort($arr))."<br/>";  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值