PHP实现冒泡、选择、插入和快速排序

来源:互联网 发布:网络博客大全评级 编辑:程序博客网 时间:2024/06/06 03:13
<?php//冒泡排序、选择排序、插入排序、快速排序//定义要排序的数组for( $i = 0; $i < 1000; $i++ ) {    $arr[] = rand(1, 100);}//冒泡排序//原理:每次从数组中比较出两个数中较大的值再继续往下比较,//直到最后一个数最大,重复操作循环使最大的数一个个冒泡出来function bubble_sort($arr) {    //计算数组的长度    $len = count($arr);    //循环($len-1)次    for ( $i = 1; $i < $len; $i++ ) {        //循环($len-$i)次        for ( $j = 0; $j < $len - $i; ) {            //第一个值大于第一个值则交换位置            if ( $arr[$j] > $arr[$j+1] ) {                $temp = $arr[$j];                $arr[$j] = $arr[$j+1];                $arr[$j+1] = $temp;            }        }    }    return $arr;}//选择排序//原理:假设第一个元素最小,将第一个元素之后的元素逐一与它比较,//取出它们中最小的取代第一个元素,//然后从第一个元素开始,继续往下比较function select_sort($arr) {    //计算数组的长度    $len = count($arr);    //循环($len-1)次    for ( $i = 0; $i < $len-1; $i++ ) {        //假设每次循环中第一个元素最小,记住最小值的下标        $p = $i;        for ( $j = $i+1; $j < $len; $j++ ) {            //找出数组中比规定最小值更小的元素,更新最小值下标            if ( $arr[$p] > $arr[$j]) {                $p = $j;            }        }        //循环结束,假如最小值的下标有变化,        //则交换目前最小值下标元素与之前假定的最小值元素        if ( $p != $i ) {            $temp = $arr[$i];            $arr[$i] = $arr[$p];            $arr[$p] = $temp;        }    }    return $arr;}//插入排序//原理:从第二个元素开始,左边的元素已经排好序,//只需要往左边插入到合适的位置(一开始左边只有第一个元素,//第二个元素与第一个元素比较后排序,然后从第三个元素开始,//分别比较第一、第二个元素...)function insert_sort($arr) {    //计算数组的长度    $len = count($arr);    //循环($len-1)次    for ( $i = 1; $i < $len; $i++ ) {        //用于插入的元素        $temp = $arr[$i];        //与左边的元素逐一比较,插入合适的位置使左边排序成功        for( $j = $i-1; $j >= 0; $j++ ) {            if ( $temp > $arr[$j] ) {                $arr[$j+1] = $arr[$j];                $arr[$j] = $temp;            } else {                break;            }        }    }    return $arr;}//快速排序//原理:每次将数组分成大小两部分,利用递归处理function quick_sort($arr) {    //计算数组长度    $len = count($arr);    //数组长度小于2直接返回    if ( $len <= 1 ) {        return $arr;    }    //设置中间的基数,以$arr[0]为分界江数组分为大小两部分    $base_num = $arr[0];    //循环($len-1)次    for ( $i = 1; $i < $len; $i++ ) {        //小于基数的在左边,大于基数的在右边        if ( $arr[$i] < $base_num ) {            $left_array[] = $arr[i];        } else {            $right_array[] = $arr[i];        }    }    //将基数追加到两组数组中间    $left_array[] = $base_num;    //继续递归划分数组    $left_array = quick_sort($left_array);    $right_array = quick_sort($right_array);    return array_merge($left_array, $right_array);}//测试不同排序算法之间的差异//速度:插入排序>选择排序>冒泡排序//快速排序有波动,当数组越大时快排优势越大,//并且逐渐一直快于其它排序$t1 = microtime(true);bubble_sort($arr);$t2 = microtime(true);echo 'bubble_sort() consume time: ';echo ($t2 - $t1)/1000 . 'ms';echo '<br />';$t1 = microtime(true);select_sort($arr);$t2 = microtime(true);echo 'select_sort() consume time: ';echo ($t2 - $t1)/1000 . 'ms';echo '<br />';$t1 = microtime(true);insert_sort($arr);$t2 = microtime(true);echo 'insert_sort() consume time: ';echo ($t2 - $t1)/1000 . 'ms';echo '<br />';$t1 = microtime(true);quick_sort($arr);$t2 = microtime(true);echo 'quick_sort() consume time: ';echo ($t2 - $t1)/1000 . 'ms';echo '<br />';$t1 = microtime(true);sort($arr);$t2 = microtime(true);echo 'sort() consume time: ';echo ($t2 - $t1)/1000 . 'ms';echo '<br />';// print_r($arr);?>
0 0
原创粉丝点击