排序算法总结

排序算法

冒泡排序 选择排序 插入排序 (效率低只有教学价值)

合并排序 快速排序(可以用在生产环境中)

/*
 * 冒泡排序
 *
   冒泡排序(Bubble Sort)是最易懂的排序算法,但是效率较低,生产环境中很少使用。
    依次比较相邻的两个数,如果不符合排序规则,则调换两个数的位置。这样一遍比较下来,能够保证最大(或最小)的数排在最后一位。

    再对最后一位以外的数组,重复前面的过程,直至全部排序完成。
 * */
function bubbleSort($arr){
    if(count($arr) < 2) return $arr;
    $_size = count($arr);
    for($i=0;$i<$_size;$i++){
        for($j=0;$j<($_size-$i-1);$j++){
            //交换顺序
            if($arr[$j] > $arr[$j+1]){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $tmp;
            }
        }
    }
    return $arr;
}

/*
 *
 * 选择排序
 * 选择排序(Selection Sort)与冒泡排序类似,也是依次对相邻的数进行两两比较。
 * 不同之处在于,它不是每比较一次就调换位置,而是一轮比较完毕,找到最大值(或最小值)之后,将其放在正确的位置,其他数的位置不变。
 *
 * */
function selectionSort($arr){
    if(count($arr) < 2) return $arr;
    $_size = count($arr);
    for($i=0;$i<$_size;$i++){
        $min = $i;
        for($j=$i+1;$j<$_size;$j++){
            //交换顺序
            if($arr[$j] < $arr[$min]){
                $min = $j;
            }
        }
        //如果当前位置不是最小值交换位置
        if($i!=$min){
            $tmp = $arr[$min];
            $arr[$min] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    return $arr;
}

/*
 * 插入排序
 * 插入排序(insertion sort)比前面两种排序方法都更有效率。它将数组分成“已排序”和“未排序”两部分,
 * 一开始的时候,“已排序”的部分只有一个元素,然后将它后面一个元素从“未排序”部分插入“已排序”部分,
 * “已排序”的部分比较排序
 * 从而“已排序”部分增加一个元素,
 * “未排序”部分减少一个元素。以此类推,完成全部排序。
 * */
function insertSort($arr){
    $_size = count($arr);
    for($i=1;$i<$_size;$i++){
        // 储存当前位置的值
        $tmp=$arr[$i];
        $key=$i-1;
        /*
         * 当已排序部分的当前元素大于value,
         * 就将当前元素向后移一位,再将前一位与value比较
         */
        while($key>=0&&$tmp<$arr[$key]){
            $arr[$key+1]=$arr[$key];
            $key--;
        }
        //交换位置$key+1 $i的比较
        if(($key+1)!=$i){
            $arr[$key+1]=$tmp;
        }
    }
    return$arr;
}


/*
1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。
 * 快速排序 非稳定排序,效率高广泛使用
 * */
function quickSort(&$arr){
    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $_size=count($arr);
        for($i=1;$i<$_size;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }elseif($arr[$i]>$k){
                $y[]=$arr[$i];
            }
        }
        $x=quickSort($x);
        $y=quickSort($y);
        return array_merge($x,array($k),$y);
    }else{
        return$arr;
    }
}

/*
 *
 * 冒泡 选择 插入排序 只有教学价值,因为效率低,很少实际使用。合并排序(Merge sort)则是一种被广泛使用的排序方法。

它的基本思想是,将两个已经排序的数组合并,要比从头开始排序所有元素来得快。
因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成。
 *
 * 合并排序
 *
 * */
$a=array(3,1,2,4,10,6,8,7,11,21);
//合并2个已经排好序的数组
function merge($a,$b){
    $i = 0; $j = 0;
    $n = count($a);
    $m = count($b);
    $data = array();
    while($i<$n && $j<$m){
        if($a[$i] < $b[$j]){
            $data[] = $a[$i++];
        }else{
            $data[] = $b[$j++];
        }
    }
    while($i<$n){
        $data[]=$a[$i++];
    }
    while($j<$m){
        $data[]=$b[$j++];
    }
    return $data;
}
function mergeSort($myArray){
    $params = array();
    $len = count($myArray);
    if($len < 2){
        return $myArray;
    }
    $middle = floor($len/2);
    $left   = array_slice($myArray,0,$middle);
    $right  =  array_slice($myArray,$middle);
        
    $params = merge(mergeSort($left),mergeSort($right));
    //删除0-len的数组并替换成排序好的数组
    array_splice($myArray,0,$len,$params);
    // 返回排序后的数组
    return $myArray;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值