PHP四种排序

来源:互联网 发布:xlplayer mac 没声音 编辑:程序博客网 时间:2024/06/06 23:55
<?phpini_set("error_reporting","E_ALL & ~E_NOTICE"); /*  * PHP各类排序算法总结 */$arr = array();$bubblearr = array();$selectarr = array();for($i = 0;$i<2000;$i++){     $arr[$i]=rand(1,9999999);}/* * bubble_sort_start0.54549100 1469071764bubble_sort_end0.92051200 1469071764selectarr_sort_start0.92051200 1469071764selectarr_sort_end0.11352300 1469071765insortarr_sort_start0.11352300 1469071765insortarrr_sort_end0.32253500 1469071765quicksortarr_sort_start0.32253500 1469071765quicksortarrr_sort_end0.33253600 1469071765 */echo 'bubble_sort_start'.microtime().'<br>';bubbleSort($arr);echo 'bubble_sort_end'.microtime().'<br>';echo 'selectarr_sort_start'.microtime().'<br>';slelectSort($arr);echo 'selectarr_sort_end'.microtime().'<br>';echo 'insortarr_sort_start'.microtime().'<br>';insertSort($arr);echo 'insortarrr_sort_end'.microtime().'<br>';echo 'quicksortarr_sort_start'.microtime().'<br>';quickSort($arr);echo 'quicksortarrr_sort_end'.microtime().'<br>';//冒泡排序function bubbleSort($arr){    $len = count($arr);    for($i=0;$i<$len-1;++$i){        for($j=0;$j<$len-$i;++$j){            if($arr[$j]>$arr[$j+1]){                $tmp = $arr[$j+1];                $arr[$j+1] = $arr[$j];                $arr[$j] =$tmp;             }        }    }    return $arr;}//选择排序//第一轮能把最大的选出来放在第一个位置,第二轮选出来第二个//思路在于假定一个flag也就是第一个为最小的,然后找他后面的,如果比他小就跟他替换掉,以此类推function slelectSort($arr){   //实现思路 双重循环排序,外层控制轮数,当前的最小值    //$i为当前最小值的位置,需要参与比较的元素    $len = count($arr);    for($i=0;$i<$len-1;++$i){        //先假设最小值的位置        $p = $i;        //$j 当前都需要和哪些元素比较,$i后边的        for($j=$i+1;$j<$len;++$j){            //$arr[$p]是当前已知的最小值            if($arr[$p]>$arr[$j]){                //比较,发现更小的,记录下最小值的位置,并且在下次比较时,应该采用最小的进行比较                $p = $j;            }        }        //已经确定了当前最小值的位置,保存到$p中        //如果发现 最小值的位置与当前假设的$i不同,那么互换即可        if($p!=$i){                 $tmp = $arr[$p];                 $arr[$p] = $arr[$i];                 $arr[$i] = $tmp;        }    }    return $arr;}//插入排序function insertSort($arr){     //区分 哪部分是已经排序好的    //哪部分是没有排序的    //找到其中一个需要排序的元素    //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素    //利用循环就可以标志出来    //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列    $len = count($arr);    for($i=0;$i<$len-1;++$i){          //获得当前需要比较的元素的值         $tmp = $arr[$i];         //内层循环控制比较并且插入         for($j=$i-1;$j>=0;$j--){              //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素                if($tmp<$arr[$j]){                    //发现插入的元素要小,交换位置                    //后边的元素与前面的元素互换。                    $arr[$j+1] = $arr[$j];                    $arr[$j] = $tmp;                }else{                    //如果碰到不需要移动的                    //由于是已经排号的,则前面就不需要在排序了                    break;                }         }    }    return $arr;}//快速排序function  quickSort($arr){    $len = count($arr);    if($len <= 1){         return $arr;    }    //选择一个flag    $flag = $arr[0];    //遍历 除了flag之外的所有元素,按照大小关系放入两个数组内    $left = array();    $right = array();    //初始化两个数组一个小于的一个大于的    for($i=1;$i<$len;++$i){        if($flag > $arr[$i]){            //放入左边数组            $left[] = $arr[$i];        }else{            //放入右边数组            $right[] = $arr[$i];        }    }    //在分别对左边和右边的数组进行相同的排序处理方式    //递归调用这个函数    $left = quickSort($left);    $right = quickSort($right);        //合并左边,标尺,右边    return array_merge($left,$flag,$right);}

0 0