常用的排序算法

1冒泡排序

   原理是依次比较相邻两个数据,使之按照从小到大或者从大到小的方式排列,一次次的遍历最终使最大或最小的数据排到列表的顶端;

方法:1

function maopao($arr){
    $len = count($arr);
    for($i=0;$i<$len-1;$i++){
        for($j=0;$j<$len-$i-1;$j++){
            if($arr[$j]>$arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j]= $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}

方法:2

function maopao($arr,$len){
    if($len <= 1){
        return $arr;
    }
    for($i=0;$i<$len-1;$i++){
        if($arr[$i]>$arr[$i+1]){
            $temp = $arr[$i];
            $arr[$i]= $arr[$i+1];
            $arr[$i+1] = $temp;
        }
    }
    $arr = maopao($arr,$len-1);
    return $arr;
}

 

function maopao($arr){
    $len = count($arr);
    for($i=0;$i<$len-1;$i++){
        if($arr[$i]>$arr[$i+1]){
            $temp = $arr[$i];
            $arr[$i]= $arr[$i+1];
            $arr[$i+1] = $temp;
        }
        if($i == $len -2 ){
            $i=-1;
            $len -=1;
        }
    }
    return $arr;
}

2,快速排序

    原理是选择一个基准值进行一次遍历,把大于或小于基准值的数据分隔成两部分,然后依照此分法依次对两部数据进行再次的遍历分割,重复多次,数据就完成了排序

方法:1

function kuaisu($arr,$left,$right){
    if($left>=$right){
        return $arr;
    }
    $head = $left;
    $foot = $right;
    $key = $arr[$head];
    while($head<$foot){
        while($head<$foot && $arr[$foot]>=$key){
            --$foot;
        }
        $arr[$head] = $arr[$foot];
        while($head<$foot && $arr[$head] <= $key){
            $head++;
        }
        $arr[$foot]= $arr[$head];
    }
    
    $arr[$head]= $key;
    
    $arr = kuaisu($arr,$left,$head-1);
    $arr = kuaisu($arr,$foot+1,$right);
    return $arr;
}

方法:2

function kuaisu($arr){
    $len = count($arr);
    if($len<=1){
        return $arr;
    }
    $min = array();
    $equ = array();
    $max = array();
    $key = $arr[0];

    for($i=0;$i<$len;$i++){
        if($arr[$i]<$key){
            $min[]=$arr[$i];
        }
        if($arr[$i]==$key){
            $equ[]=$arr[$i];
        }
        if($arr[$i]>$key){
            $max[]=$arr[$i];
        }
    }
    return array_merge_recursive(kuaisu($min),$equ,kuaisu($max));
}

3,直插排序

原理是选取一个值插入到已经排序好的序列中,依次遍历插入,直到排好序列

    方法:1

   function insert($arr){
    $len =count($arr);
    for($i=0;$i<$len;$i++){
        $key = $arr[$i];
        for($j=$i;$j>=1;$j--){
            if($arr[$j-1]>= $key){
                $arr[$j]  = $arr[$j-1];
            }else{
                break;
            }
        }
        $arr[$j]=$key;
    }
    return $arr;    
}

方法:2

 function insert($arr){
    $len = count($arr);
    for($i=0;$i<$len;$i++){
        for($j=$i;$j>=1;$j--){
            if($arr[$j-1]>$arr[$j]){
                $temp = $arr[$j];
                $arr[$j]= $arr[$j-1];
                $arr[$j-1]= $temp;    
            }else{
                break;
            }
        }
        
    }
    return $arr;
}

4,希尔排序

  原理是通过选择d<n的数据游标长度来分割数列为多组,每组进行插入排序,然后缩小d至1,重复首次的方式排序,直到所有数据为一组位置,数据排序完成

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

如果d=3,那么 $arr[0] 和 $arr[3] 进行比较 ,依次类推;完成一趟排序;然后在缩小d,重复上面的动作,直到d=1

     

function xier($arr){
    $len = count($arr);
    $d = floor($len/2);
    for($d;$d>0;$d=floor($d/2)){
        for($i=$d;$i<$len;$i++){
            for($j=$i-$d;$j>=0;$j = $j-$d){
                if($arr[$j]>$arr[$j+$d]){
                    $temp  = $arr[$j];
                    $arr[$j]= $arr[$j+$d];
                    $arr[$j+$d] = $temp;
                }
            }
        }
    }
    return $arr;
}

方法:2

function xier($arr){
    $len = count($arr);
    for($d = $len/2;$d>0;$d /=2){
        for($i=$d;$i<$len;$i++){
            $j = $i;
            while($j-$d>=0 && $arr[$j] > $arr[$j-$d]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j-$d];
                $arr[$j-$d] = $temp;
                $j -= $d;
            }
        }
    }
    return $arr;
}

5,堆排序

原理是利用堆的特性,使其堆成为大根堆或小根堆,交换其堆顶值和该数列剩余数列值的最后一个值,然后再从新排列剩余数据的堆使其成为大或者小根堆,依次重复多次直到只剩一个数值,该数列排序完成;

function duixu($arr){
    $len = count($arr);

   //调整大堆(注:也可以小堆)
    $dui = function($arr,$i,$end){
        $key = $arr[$i];
        for($j=$i*2+1;$j<$end;$j=$j*2+1){
            if($j+1< $end && $arr[$j] < $arr[$j+1]){
                $j++;
            }
            if($arr[$j]>$key){
                $arr[$i] = $arr[$j];
                $i=$j;
                
            }else{break;}
        }
        $arr[$i] = $key;
        return $arr;
    };
    

// 把数组初始化堆
    for($i=$len/2-1;$i>=0;$i--){
        $arr = $dui($arr,$i,$len);
    }
    

//进行对堆的排序
    for($m = $len-1;$m>=0;$m--){
        $temp =$arr[0];
        $arr[0] = $arr[$m];
        $arr[$m]= $temp;
        $arr = $dui($arr,0,$m);
    }
    return $arr;
}

6.选择排序

原理就是每次遍历剩余的数列,找到与开始选定的游标对应的数据相比较,最大或者最小的数据的游标,然后交换其数值,直到最后的游标处。

function xuanze($arr){
    $len = count($arr);
    for($i=0;$i<$len-1;$i++){
        $min = $i;
        for($j=$min+1;$j<$len;$j++){
            if($arr[$min] > $arr[$j]){
                $min = $j;
            }
        }
        if($min !=$i){
            $temp = $arr[i];
            $arr[$i] = $arr[$min];
            $arr[$min] = $temp;
        }
        
    }
    return $arr;
    
}

7 合并排序

 原理是把两个已经排好的序的数列,合并成一个有序的数列的,其过程是先要分组已有的无序数列并排序,然后合并,

function megerArr($arrA,$arrB){
    $arrC = array();
    while(count($arrA) && count($arrB)){
        $arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB);
    }
    return array_merge($arrC, $arrA, $arrB);
}

function megerSort($arr){
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    $m = floor($len/2);
    $left = array_slice($arr, 0, $m);
    $right = array_slice($arr, $m);
    $left = megerSort($left);
    $right = megerSort($right);
    $arr = megerArr($left,$right);
    return $arr;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值