排序算法(冒泡、快速、选择、插入)

  1. <?php    
  2.     header("content-type:text/html;charset=utf-8");  
  3.     array(2,5,9,4,7,6,1,8,3);
  4.     echo implode(" ",$arr)."<br/>";  
  5.     //---------------------------------------  
  6.     //       常用排序算法  
  7.     //---------------------------------------  
  8.     //冒泡    
  9.     function BubbleSort($arr)    
  10.     {      
  11.       $len=count($arr);    
  12.       //设置一个空数组 用来接收冒出来的泡    
  13.       //该层循环控制 需要冒泡的轮数    
  14.       for($i=1;$i<$len;$i++)    
  15.       { //该层循环用来控制每轮 冒出一个数 需要比较的次数    
  16.         for($k=0;$k<$len-$i;$k++)    
  17.         {    
  18.            if($arr[$k]>$arr[$k+1])    
  19.             {    
  20.                 $tmp=$arr[$k+1];    
  21.                 $arr[$k+1]=$arr[$k];    
  22.                 $arr[$k]=$tmp;    
  23.             }    
  24.         }    
  25.       }    
  26.       return $arr;    
  27.     }     
  28.     echo '冒泡排序:';  
  29.     echo implode(' ',BubbleSort($arr))."<br/>";  
  30.        
  31.     //快速排序  
  32.     function QSort($arr) {    
  33.         //先判断是否需要继续进行    
  34.         $length = count($arr);    
  35.         if($length <= 1) {    
  36.             return $arr;    
  37.         }    
  38.         //如果没有返回,说明数组内的元素个数 多余1个,需要排序    
  39.         //选择一个标尺    
  40.         //选择第一个元素    
  41.         $base_num = $arr[0];    
  42.         //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内    
  43.         //初始化两个数组    
  44.         $left_array = array();//小于标尺的    
  45.         $right_array = array();//大于标尺的    
  46.         for($i=1; $i<$length$i++) {    
  47.             if($base_num > $arr[$i]) {    
  48.                 //放入左边数组    
  49.                 $left_array[] = $arr[$i];    
  50.             } else {    
  51.                 //放入右边    
  52.                 $right_array[] = $arr[$i];    
  53.             }    
  54.         }    
  55.         //再分别对 左边 和 右边的数组进行相同的排序处理方式    
  56.         //递归调用这个函数,并记录结果    
  57.         $left_array = QSort($left_array);    
  58.         $right_array = QSort($right_array);    
  59.         //合并左边 标尺 右边    
  60.         return array_merge($left_arrayarray($base_num), $right_array);    
  61.     }    
  62.     echo "快速排序:";  
  63.     echo implode(' ',QSort($arr))."<br/>";  
  64.        
  65.     //选择排序  
  66.     function SelectSort($arr) {    
  67.     //实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数    
  68.         //$i 当前最小值的位置, 需要参与比较的元素    
  69.         for($i=0, $len=count($arr); $i<$len-1; $i++) {    
  70.             //先假设最小的值的位置    
  71.             $p = $i;    
  72.             //$j 当前都需要和哪些元素比较,$i 后边的。    
  73.             for($j=$i+1; $j<$len$j++) {    
  74.                 //$arr[$p] 是 当前已知的最小值    
  75.                 if($arr[$p] > $arr[$j]) {    
  76.          //比较,发现更小的,记录下最小值的位置;并且在下次比较时,    
  77.      // 应该采用已知的最小值进行比较。    
  78.                     $p = $j;    
  79.                 }    
  80.             }    
  81.             //已经确定了当前的最小值的位置,保存到$p中。    
  82.      //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可    
  83.             if($p != $i) {    
  84.                 $tmp = $arr[$p];    
  85.                 $arr[$p] = $arr[$i];    
  86.                 $arr[$i] = $tmp;    
  87.             }    
  88.         }    
  89.         //返回最终结果    
  90.         return $arr;    
  91.     }    
  92.     echo "选择排序:";  
  93.     echo implode(' ',SelectSort($arr))."<br/>";  
  94.        
  95.     //插入排序  
  96.     function InsertSort($arr) {    
  97.         //区分 哪部分是已经排序好的    
  98.         //哪部分是没有排序的    
  99.         //找到其中一个需要排序的元素    
  100.         //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素    
  101.         //利用循环就可以标志出来    
  102.         //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,    
  103.         //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列    
  104.         for($i=1, $len=count($arr); $i<$len$i++) {    
  105.             //获得当前需要比较的元素值。    
  106.             $tmp = $arr[$i];    
  107.             //内层循环控制 比较 并 插入    
  108.             for($j=$i-1;$j>=0;$j--) {    
  109.        //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素    
  110.                 if($tmp < $arr[$j]) {    
  111.                     //发现插入的元素要小,交换位置    
  112.                     //将后边的元素与前面的元素互换    
  113.                     $arr[$j+1] = $arr[$j];    
  114.                     //将前面的数设置为 当前需要交换的数    
  115.                     $arr[$j] = $tmp;    
  116.                 } else {    
  117.                     //如果碰到不需要移动的元素    
  118.                //由于是已经排序好是数组,则前面的就不需要再次比较了。    
  119.                     break;    
  120.                 }    
  121.             }    
  122.         }    
  123.         //将这个元素 插入到已经排序好的序列内。    
  124.         //返回    
  125.         return $arr;    
  126.     }    
  127.     //var_dump(InsertSort($arr));  
  128.     echo '插入排序:';  
  129.     echo implode(' ',InsertSort($arr))."<br/>";  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值