zoukankan      html  css  js  c++  java
  • 关于PHP数组的一些排序。

    <?php
    // 冒泡排序法
       //$arr = array(0,5,-1,3,4,5,32,22,-3,-4,-7);
    
       //var_dump($arr);
       function arr_sort($arr){
          for ($a = 1; $a <= count($arr) ; $a++) {
             for ($i=0; $i < count($arr)-$a ; $i++) {
                if ($arr[$i] > $arr[$i+1]) {
                   $temp = $arr[$i];
                   $arr[$i] = $arr[$i+1];
                   $arr[$i+1] = $temp;
                }
             }
          }
          return $arr;
       }
       //var_dump(arr_sort($arr));
    
       //选择排序法 原理: 先认为第一个位置的是最值,然后将自己放入一个临时值(minVal),然后去和无序区比较,如果发现minval
       //不是最值,那就将新的最值和自己对换,完毕后,将最值放入原本的位置;
       //这样,前面的值都是有序的了
       function selectSort($arr){
          $temp = 0;
          for ($i=0; $i <count($arr)-1 ; $i++) { //最后一次不必要比较,因为前面都已经有序了
             //记录有序区的最新那个值 和下标 用于新的最值进行插入
             $minVal = $arr[$i];
             $minIndex = $i;
             for ($j=$i+1; $j <count($arr) ; $j++) { //$i+1:墙面都有序了,无需比较,所以要被排查的数组变短了
                if ($minVal < $arr[$j]) {//在无序区取出最值
                   $minVal = $arr[$j];
                   $minIndex = $j;//记录下标是因为:该下标会一直被刷新,直到最值,然后用于和有序区最后的那个值对换
                   //保证正真的对换只发生一次就好
                }
             }
             if ($i != $minIndex) {//最值小标不一样才对换
                $temp = $arr[$i];
                $arr[$i] = $arr[$minIndex];
                $arr[$minIndex] = $temp;
             }
          }
          return $arr;
       }
       // var_dump(selectSort($arr));
    
       //插入排序 原理:开始从数组的第二位开始,和前面比较前 先将比较的值记录在temp临时变量里面
       //发现 比自己小的值就将小的值复制然后 放在自己当时的位置下标处,这样就会有两个一样的值了;将要比较的新值 继续往前寻找(由key决定)
       //发现不满足条件的,就取当前位置的下标,将自己插入 整个过程只有插入,没有替换
       function insertSort($arr){
          for ($i=1; $i < count($arr) ; $i++) {
             $temp = $arr[$i];
             $key = $i-1;
             while ($key>=0 && $temp<$arr[$key]) {
                $arr[$key+1] = $arr[$key];
                $key--;//注意key移动到了一个未知的值,如果下次比较不会进入这个循环,绝对会导致temp对换的目标错误
             }//直到temp找到合适的位置那就退出循环,或者到顶了
             if (($key+1)!=$i) {//和temp比较的数不是本身的前一位,如果是前一位,那就不用插入,自己待在自己的位置
                $arr[$key+1] = $temp;
             }
          }
          return $arr;
       }
    
       //快速排序法  特点,第一遍历,K的值不变 具体原理:只想说不简单 百度去
       function quickSort($array)
       {
           if(!isset($array[1]))
               return $array;
           $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素
           $leftArray = array();
           $rightArray = array();
    
           foreach($array as $v)
           {
               if($v > $mid)
                   $rightArray[] = $v;  //把比$mid大的数放到一个数组里
               if($v < $mid)
                   $leftArray[] = $v;   //把比$mid小的数放到另一个数组里
           }
    
           $leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割
           $leftArray[] = $mid;        //把分割的元素加到小的数组后面,不能忘了它哦
    
           $rightArray = quickSort($rightArray);  //把比较大的数组再一次进行分割
           return array_merge($leftArray,$rightArray);  //组合两个结果
       }
       //来个20W的数据测试
       $arr = array();
       for ($i=0; $i <200000 ; $i++) { //上200W数据就爆内存了
          $arr[] = mt_rand(0,9999);
       }
       echo '执行前'.date('Y-m-d h:i:s').'<br>';
       quickSort($arr);
       echo '执行后'.date('Y-m-d h:i:s');
    
    
    
     ?>
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>四种数组排序法</title>
    	</head>
    	<body>
    	</body>
    </html>
  • 相关阅读:
    jQuery 核心
    Visual Studio 文件没发布出来
    冷门JS技巧
    项目发布: error CS0103: 当前上下文中不存在名称“*****”
    jQuery编程的最佳实践
    HTML5中类jQuery选择器querySelector的使用
    html dl dt dd标签元素语法结构与使用
    EF Code First 更新数据库, 数据库迁移
    ASP.NET MVC中的拦截器
    C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等
  • 原文地址:https://www.cnblogs.com/lgqtecng/p/6415567.html
Copyright © 2011-2022 走看看