PHP数组排序

【内部排序法】n=count($arr)

一、交换排序法

  1.冒泡排序法

<?php
//冒泡排序法(升序)
    $arr = array(55,20,10,8,2,0);
    function bubblesort(&$arr) {
        //外循环控制排序趟数,n个数排n-1趟(第二个数排序好后,第一个数不需要再次重复循环排序)
        for($i=0;$i<count($arr)-1;$i++) {
            // 每个元素依次比较,每每两元素比较大小,即循环n-1次;后面已排序好的数不进行下次的循环排序,即n-$i-1
            for($j=0; $j<count($arr)-$i-1; $j++) {
                if($arr[$j]>$arr[$j+1]) {
                    $temp = $arr[$j];
                    $arr[$j] = $arr[$j+1];
                    $arr[$j+1] = $temp;
                }
//                echo ($arr[$j])."&nbsp";
            }
//            print_r($arr);
//            echo '<br />';
        }
    }
    bubbleSort($arr);
    print_r($arr);
?>

算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。
算法分析:定义n-1次循环,每个数字比较n-j次,比较前一个数和后一个数的大小。然后交换顺序。

  2.快速排序法

<?php
//快速排序法
    $arr = array(10,5,2,9,23,22,7,6,11,8);
    function quickSort($arr) {
        //如果不是数组或数组是空的,返回空数组
        if(!is_array($arr) || empty($arr)) {
            return array();
        }
        //数组长度<=1时返回数组
        if(count($arr)<=1) {
            return $arr;
        }
        //将第一个数设为树的顶点,即中间点
        $middle[0] = $arr[0];
        //在其中间点左右分别开左右数组
        $left = array();
        $right = array();
        //从第二个数开始做n-1趟循环
        for($i=1; $i<count($arr); $i++) {
            //如果从第一个数开始的数<=中间点
            if($arr[$i]<=$middle[0]) {
                //则将无序数赋给左边数组
                $left[]=$arr[$i];
                //否则赋给右边数组
            } else {
                $right[]=$arr[$i];
            }
        }
/*        echo 'L:';
        print_r($left);
        echo '<br />M:';
        print_r($middle);
        echo '<br />R:';
        print_r($right);
        echo '<br />';*/
        //上面的判断完成一趟遍历比较赋值后,递归,并继续赋给左右数组
        $left = quickSort($left);
        $right = quickSort($right);
        //然后将左中右的数连结合并成一个数组,并返回
        return array_merge($left,$middle,$right);
    }
    print_r(quickSort($arr));
?>

 

二、选择排序法

  1.选择排序法

<?php
//选择排序法(升序)
    $arr = array(8,7,6,5,3,1);

    function selectSort(&$arr) {
        //外循环控制循环趟数,n个数循环n-1趟
        for($i=0; $i<count($arr)-1; $i++) {
            //假设当前趟数的第一个数为最值,记在$k下标中
            $k = $i;
            //从下个数到最后一个数之间找最值
            for($j=$k+1; $j<count($arr); $j++) {
                //若其后有比最值更小的
                if($arr[$k]>$arr[$j]) {
                    //则将其下标记在$k中
                    $k = $j;
                }
            }
            //若$k不为最初的i值,说明在其后找到比其更大的数
            if($k != $i) {
                //则交换最值和当前序列的第一个数
                $temp = $arr[$i];
                $arr[$i] = $arr[$k];
                $arr[$k] = $temp;
            }
        }
    }

    selectSort($arr);
    print_r($arr);

?>

算法特点:每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。
算法分析:定义外部n-1次循环,假设第一个为最值,放在参数中,在从下一个数以后找最值若后面有比前面假设的最值更大的就放在k中,然后在对k进行分析。若k不位最初的i值。也就是假设的i不是最值,那么就交换最值和当前序列的第一个数。

  2.堆排序

 

三、插入式排序法

  1.插入排序法

<?php 
//插入排序法(升序)
    $arr = array(5,10,3,2,1,0);
    function insertSort(&$arr) {
        //外层循环,假设第一个数为排好的数,从第二个数开始循环
        for($i=1; $i<count($arr); $i++) {
            //将当前循环的数先保存在临时变量中
            $temp = $arr[$i];
            //内层循环,待插入的位置
            $j=$i-1;
            for($j; $j>=0; $j--) {
                //从后往前比较,比前一个元素小
                if($arr[$j]>$temp) {
                    //把大的数往后移
                    $arr[$j+1]=$arr[$j];    
                } else {
                    break;
                }                
            }
            if(($j+1)!= $i) {
                //找到正确位置,插入事前保存的元素
                $arr[$j+1]=$temp;
            }
        }
    }
    insertSort($arr);
    print_r($arr);
?>

  2.希尔排序法

 

【外部排序法:借助外部文件排序】

注:如果将排序法封装成一个函数,以便日后直接调用该函数排序,可使用返回值,或形参加地址符【&】,如:&$arr

posted @ 2014-10-05 23:55  ayee  阅读(300)  评论(0编辑  收藏  举报