php常见的排序算法代码示例

//冒泡排序

原理:依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序

function bubble_sort($a)
{
    if (!is_array($arr) || empty($arr)) {
        return false;
    }
    // 第一层可以理解为从数组中键为0开始循环到最后一个
    for ($i = 0; $i < count($a) ; $i++) {
      // 第二层为从$i+1的地方循环到数组最后
        for ($j = $i+1; $j < count($a); $j++) {
         // 比较数组中两个相邻值的大小
            if ($a[$i] > $a[$j]) {
                $tem = $a[$i]; // 这里临时变量,存贮$i的值
                $a[$i] = $a[$j]; // 第一次更换位置
                $a[$j] = $tem; // 完成位置互换
            }
        }        
    }
    return $a;
}

//快速排序

原理:设置一个初始中间值,来将需要排序的数组分成3部分,小于中间值的左边,中间值,大于中间值的右边,继续递归用相同的方式来排序左边和右边,最后合并数组

function quick_sort($a)
{
    // 判断是否需要运行,因下面已拿出一个中间值,这里<=1
    if (count($a) <= 1) {
        return $a;
    }

    $middle = $a[0]; // 中间值
    $left = array(); // 接收小于中间值
    $right = array();// 接收大于中间值

    // 循环比较
    for ($i=1; $i < count($a); $i++) {

        if ($middle < $a[$i]) {

           // 大于中间值
           $right[] = $a[$i];
        } else {

           // 小于中间值
           $left[] = $a[$i];
        }
    }

  // 递归排序划分好的2边
  $left = quick_sort($left);
  $right = quick_sort($right);

  // 合并排序后的数据,别忘了合并中间值
  return array_merge($left, array($middle), $right);
}

//插入排序

原理:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

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 SelectionSort($arr)
{
    $length = count($arr);
    for ($i = 0; $i < $length - 1; $i++) {            // $i为已经排序序列的末尾下标
        $min = $i;                    // 暂存未排列序列的最小值下标
        for ($j = $i + 1; $j < $length; $j++) {        // 遍历未排列序列
            if ($arr[$j] < $arr[$min]) {        // 找出排列序列最小值,下标赋给$min
                $min = $j;
            }
        }
        if ($min != $i) {                // 如果找到最小值,放到已排列序列末尾
            $t = $arr[$min];
            $arr[$min] = $arr[$i];
            $arr[$i] = $t;
        }
    }
    return $arr;
}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值