php面试算法题-数组排序

标题php面试算法题-数组排序

 //冒泡排序,
    //两个元素依此比对,如果顺序错误,则调换顺序
    /*$arr = [2,5,8,1,6,4];
    for ($i=0;$i<count($arr)-1;$i++){
        for ($j=0;$j<count($arr)-1-$i;$j++){
            if ($arr[$j]>$arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    var_dump($arr);*/

    //选择排序
    //每次都找出整个队列里的最小值(或最大值),放在序列的起始位置,直到全部待排序的序列排完
    //选择排序不稳定,(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
   /* $arr = [2,5,8,1,6,4];
    $len = count($arr);
    for($i=0; $i<$len-1;$i++){
        $min_val = $arr[$i];
        $min_index = $i;
        for ($j=$i+1;$j<$len;$j++){
            if ($min_val>$arr[$j]){
                $min_val = $arr[$j];
                $min_index = $j;
            }
        }
        $temp = $arr[$i];
        $arr[$i] = $min_val;
        $arr[$min_index] = $temp;
    }
var_dump($arr);*/

   //插入排序
    //它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
    //插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),
    //因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
    //算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
   /* $arr = [2,3,8,1,6,4];
    $len = count($arr);
    for($i=1; $i<$len;$i++){
        $temp = $arr[$i];
        for ($j=$i-1; $j>=0;$j--){
            if ($arr[$j]>$temp){
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
    var_dump($arr);*/
    //快速排序
    //通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小
    //然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
    /*$arr = [2,3,8,1,6,4];
    function quickSort($arr){
        if (!isset($arr[1])) return $arr;
        $mid = $arr[0]; //从数列中挑出一个元素,称为 “基准”(pivot),一般为首个元素,
        $len = count($arr);
        $left = $right = array();
        for ($i=1;$i<$len;$i++) {
            if ($mid > $arr[$i]){
                $left[] = $arr[$i];
            }else{
                $right[] = $arr[$i];
            }
        }
        $left = quickSort($left);
        $left[] = $mid;
        $right = quickSort($right);

        return array_merge($left,$right);
    }
    print_r(quickSort($arr));*/

    //归并排序
    //将两个或者两个以上的有序表合成一个新的有序表,即把待排序的序列分成多个子序列,再将已有序的子序列合并,得到最终有序的序列
    //递归分表,将数组一分为二,知道剩余一个元素为止
    function mergeSort(array &$arr) {
        $start = 0;
        $end = count($arr) - 1;
        Msort($arr,$start,$end);
    }
    function Msort(array &$arr, $start,$end) {
        if ($start < $end) {
            $mid = floor(($start + $end)/2);
            Msort($arr,$start,$mid);
            Msort($arr, $mid+1, $end);
            Merge($arr,$start,$mid,$end);
        }
    }
    function Merge(array &$arr,$start,$mid,$end) {
        $i = $start;
        $j = $mid + 1;
        $k = $start;
        $temp = array();

        while ($i != $mid+1 && $j!=$end+1) {
            if ($arr[$i] <= $arr[$j]){
                $temp[$k++] = $arr[$i++];
            }else{
                $temp[$k++] = $arr[$j++];
            }
        }

        while ($i != $mid + 1) {
            $temp[$k++] = $arr[$i++];
        }

        while ($j != $end+1) {
            $temp[$k++] = $arr[$j++];
        }

        for($i=$start; $i<=$end; $i++){
            $arr[$i] = $temp[$i];
        }
    }
    $arr = [2,3,0,1,6,4];mergeSort($arr);
    print_r($arr);

转自原文:https://www.cnblogs.com/sunshineliulu/p/8573991.html
https://www.cnblogs.com/jing1208/p/6289840.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值