php算法 快速排序 选择算法 冒泡算法

顺序依次为  快速排序  --》选择排序 ---》冒泡算法 

我的实例很好理解  因为前几天面试看了下别人写的 网上搜的 总觉得不怎么样,所以自己写了下整理了下

1. 快速排序

<?php
//快速排序是个十分有效的高效率算法,
//其思想是先选一个标尺,用它把整个队列过一遍筛选,以保证其他
//左边的元素都不大于大,其他右边的元素都不小于它

$arr = array(19,8,17,16,5);
function quickSort($arr){
    //获取数组长度
    $length = count($arr);
    //判断长度是否需要继续二分比较
    if($length<=1){ return $arr; }
    //定义基准元素
    $base = $arr[0];
    //定义两个空数组,用于存放和基准元素的比较后的结果
     $left = []; $right = [];
    //遍历数组
    for($i=1;$i<$length;$i++){
//        和基准元素作比较
        if($arr[$i]>$base){
            $right[] = $arr[$i];
        }else{
            $left[] = $arr[$i];
        }
    } //然后递归分别处理left和right
    $left = quickSort($left);
    $right =quickSort($right);
    //合并
    return array_merge($left,[$base],$right);
}
$arr = quickSort($arr);
print_r($arr);

2. 选择排序

算法描述

假设实现升序

① 在每趟中,假设一个元素是最小值(有可能不是真正的),记录此时的下标

② 使用该元素(下标不能取到最大下标)剩下的各个元素侧的,能取到最大下标)比较:找到更小值,记录对应元素下标

③ 使用每次找到的(已知的)最小值与剩下的元素进行比较,继续查找更小的值

④ 本趟比较完成,将假设的最小值,与真正的最小值元素交换位置

⑤ 所有比较结束,则返回数组

<?php
$arr = array(19,8,17,16,5);

echo "<pre>";
//未排序之前
print_r($arr);
echo  "</pre>";
echo  "<hr>";

//选择排序  升序
function select($arr){
   //计算下标的范围
   $n = count($arr);
    //最大的下标是$n-1; 

   //假设最小值(左侧,下标比较小的)与剩下的元素(右侧的元素,比假设的最小值下标至少大1)的逐一比较
   for($i=0;$i<$n-1;$i++){
      //假设一个元素为最小值
      $index = $i;

      for($j=$i+1;$j<$n;$j++){
         if($arr[$index]>$arr[$j]){
            //index 的值被覆盖
            //已知的最小值与剩下的元素比较
            $index = $j;
         }
      }

      //以上的for循环执行完毕,相当于本趟执行完
      //找到了一个最小值
      
      //假设的最小值$arr[$i]
      //与找到的最小值交换位置$arr[$index]
      $tem = $arr[$i]; //初始假设的最小值
      $arr[$i] = $arr[$index]; //真正的最小值 $Index 不可以使用  (内层for循环执行完,此刻$j 为$len-1)
      $arr[$index] = $tem;
   }
   return $arr;
}
$arr = select($arr);
print_r($arr);

3. 冒泡算法排序

<?php
$arr = array(19,8,17,16,5);

echo "<pre>";
//未排序之前
print_r($arr);
echo  "</pre>";
echo  "<hr>";

/**
 * 冒泡排序,较大的泡泡排在上面,对应的数组中,为较大的元素放在数组的末尾,没糖循环中,通过两两比较,将较大的元素放在右侧
 *
 * 第几轮  外层循环的次数,数组的长度-1;
 * 内层循环:比较次数,长度-1-第几轮
 * @var [type]
 */
$n = count($arr);
//for 外层循环
for ($i=0; $i <$n-1 ; $i++) {
    //内层循环,每一步比上一次少一次比较
    for ($j=0; $j <$n-1-$i ; $j++) {
        if($arr[$j]>$arr[$j+1]){
            $tem = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $tem;
        }
    }
}

echo "<pre>";
//   冒泡排序之后
print_r($arr);
echo  "</pre>";
echo  "<hr>"; 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值