PHP中的几种常用排序算法及思想

PHP中的几种常用排序算法及思想

1,冒泡排序
冒泡排序思想:以升序为例,从第一个元素开始,对数组中两两相邻的元素进行比较,将较小的元素放在前边,较大的元素放在后边。一轮比较结束之后,一个最大的数沉底,成为数组中的最后一个元素。n个元素,经过n-1轮的比较之后完成排序。

/**
*@param array $arr
 *@return array $arr 
*/
function BubbleSort($arr) {

$len = count($arr);//获取数组长度

for ($i = 1; $i < $len; $i++) {

    for ($j = $len - 1; $j >= $i ; $j--) {

        if ($arr[$j] < $arr[$j-1]) {//相邻两个元素进行比较

            $iTemp = $arr[$j-1];

            $arr[$j-1] = $arr[$j];

            $arr[$j] = $iTemp;

        }

    }

}

return $arr;

}

2,交换排序
交换排序思想:就是根据数组中两个值的比较结果来对换这两个值在序列中的位置,交换排序的特点是:将值较大的向数组的尾部移动,较小的值向数组的前部移动。

/**
*@param array $arr
*@return array $arr
*/
function ExchangeSort($arr){

$len = count($arr);//获取数组长度

for ($i = 0;$i < $len - 1; $i++) {

    for ($j = $i + 1; $j < $len; $j++) {

        if ($arr[$j] < $arr[$i]) {

            $iTemp = $arr[$i];

            $arr[$i] = $arr[$j];

            $arr[$j] = $iTemp;

        }

    }

}

return $arr;

}

3,选择排序
选择排序思想:它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

/**
*@param array $arr
*@return array $arr 
*/
function SelectSort($arr) {

$len = count($arr);//获取数组长度

for ($i = 0;$i < $len-1; $i++) {

    $iTemp = $arr[$i];

    $iPosition = $i;

    for ($j = $i + 1;$j < $len; $j++){

        if ($arr[$j] < $iTemp) {

            $iTemp = $arr[$j];

            $iPosition = $j;

        }

    }

    $arr[$iPosition] = $arr[$i];

    $arr[$i] = $iTemp;

}

return $arr;

}

4,插入排序
插入排序思想:将一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。

这里写图片描述

/**
*@param array $arr
 *@return array $arr 
*/
function InsertSort($arr){

$len = count($arr);

for ($i = 1;$i < $len; $i++) {

    $iTemp = $arr[$i];

    $iPos = $i - 1;

    while (($iPos >= 0) && ($iTemp < $arr[$iPos])) {

        $arr[$iPos + 1] = $arr[$iPos];

        $iPos--;

    }

    $arr[$iPos+1] = $iTemp;

}

return $arr;

}

5,快速排序
快速排序思想:
1.先从数列中取出一个数作为基准数,记为x。
2.分区过程,将不小于x的数全放到它的右边,不大于x的数全放到它的左边。(这样key的位置左边的没有大于key的,右边的没有小于key的,只需对左右区间排序即可)
3.再对左右区间重复第二步,直到各区间只有一个数

/**
*@param array $arr
 *@return array $new_arr 
*/
function QuickSort($arr){

$num = count($arr);

$l = $r = 0;

$left = $right = array();

for ($i = 1;$i < $num; $i++) {

    if ($arr[$i] < $arr[0]) {

        $left[] = $arr[$i];

        $l++;

    } else {

        $right[] = $arr[$i];

        $r++; //

    }

}

if($l > 1) {

    $left = QuickSort($left);

}

$new_arr = $left;

$new_arr[] = $arr[0];

if ($r > 1) {

    $right = QuickSort($right);

}

for($i = 0;$i < $r; $i++) {

    $new_arr[] = $right[$i];

}

return $new_arr;

}

这几种排序算法的思想都很简单,拿出纸笔写几个数据,自己画画就明白了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值