常见五种排序算法PHP

一、冒泡排序
稳定,O(n^2),设置了flag算是一种优化,避免了后续没必要的比较

function BubbleSort($arr) {
    $len = count($arr);
    //该层循环控制 需要冒泡的轮数
    for ($i = 1; $i < $len; $i++) {
        $flag = false;    //本趟排序开始前,交换标志应为假
        //该层循环用来控制每轮 冒出一个数 需要比较的次数
        for ($k = 0; $k < $len - $i; $k++) {
            //从小到大排序
            if ($arr[$k] > $arr[$k + 1]) {
                $tmp = $arr[$k + 1];
                $arr[$k + 1] = $arr[$k];
                $arr[$k] = $tmp;
                $flag = true;
            }
        }
        if(!$flag) return $arr;
    }
}

二、选择排序
不稳定,O(n^2)

function selectSort($array){
    for($i = 0;$i < count($array) - 1;$i++){
        $minVal = $array[$i]; //假设$i就是最小值
        $minValIndex = $i;
        for($j = $i+1;$j < count($array);$j++){
            if($minVal > $array[$j]){ //从小到大排列
                $minVal = $array[$j]; //找最小值
                $minValIndex = $j;
            }
        }
        if($i != $minValIndex){
          //交换两个值
          $temp = $array[$i];
          $array[$i] = $array[$minValIndex];
          $array[$minValIndex] = $temp;
        }

    }
}

三、插入排序
稳定,O(n^2)

function insertSort($arr) {
    //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
    $len=count($arr);
    for ($i=1; $i < $len; $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($array){
    //判断参数是否是一个数组
    if(!is_array($arr)) return false;
    //递归出口:数组长度为1,直接返回数组
    $length=count($arr);
    if($length<=1) return $arr;

    $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素
    $leftArray = array();
    $rightArray = array();
    foreach($array as $v){
        if($v > $mid){
            $rightArray[] = $v; //把比$mid大的数放到一个数组里
        }else{
            $leftArray[] = $v; //把比$mid小的数放到另一个数组里
        }
    }
    $leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割
    $rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割
    return array_merge($leftArray ,$mid,$rightArray );
}

五、归并排序

/* * 归并排序 * 归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。 * 这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。 * */ function mergeSort(&$arr){ $len = count($arr); msort($arr,0,$len-1); } function msort(&$arr,$low,$high){ if($low<$high){ $mid = floor(($low+$high)/2); msort($arr, $low, $mid); msort($arr,$mid+1,$high); mergeArray($arr,$low,$mid,$high); } } function mergeArray(&$arr,$low,$mid,$high){ $i = $low; $j = $mid+1; while($i<=$mid && $j<=$high){ if($arr[$i]<$arr[$j]){ $tmp[] = $arr[$i++]; }else{ $tmp[] = $arr[$j++]; } } while($i<=$mid){ $tmp[] = $arr[$i++]; } while($j<=$high){ $tmp[] = $arr[$j++]; } $len = count($tmp); for($k=0;$k<$len;$k++){ $arr[$low+$k] = $tmp[$k]; } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值