zoukankan      html  css  js  c++  java
  • PHP快速排序(递归)

    日常的排序算法中,快速排序是其中一种。实现起来相对简单。

    假设有一个数组,有若干(N)个元素(数字且无序),需要对其进行从小到大的排序。

    快速排序的思路是怎么样的呢?

    取一个中间值,然后,用其他数组元素逐一和这个中间值比较,小于中间值的放在一个数组里,大于中间值的放到另一个数组里。

    这样就以中间值为分界,分成了两个独立数组,一边都小于中间值,一边都大于中间值。这样就完成了一次大致的排序。

    然后呢,针对这两个数组,做同样的操作,取中间值对比,再分成两个独立的数组,结果还是一边小,一边大。

    直到这个数组最后只剩一个元素,就不需要操作了。然后把这两边数组,中间加上中间值,最终就是一个从小到大的排序了。

    这个形式,符合递归的思想,重复做同样的事情,碰到一个特定的情况结束调用。

    中间值,一般也就是取数组第一个元素,然后逐一和其对比。然后拆分成两个数组,然后只要该数组元素不唯一,则自己调用自己。将数组作为参数继续传递。

     1 function quick_sort($arr)
     2 {
     3     $left = $right = [];
     4     $len = count($arr);//获取数组长度
     5     if ($len <= 1) {
     6         return $arr;//数组里只有一个元素的时候,返回(递归出口)
     7     }
     8     for ($i = 1; $i < $len; $i++) {//第一个元素做中间值比对,因此从第二个元素开始循环
     9         if ($arr[$i] < $arr[0]) {
    10             $left[] = $arr[$i];//小于中间值的存入左数组
    11         } else {
    12             $right[] = $arr[$i];//大于等于中间值的存入右数组
    13         }
    14     }
    15     $left = quick_sort($left);//继续处理比对左边的数组
    16     $right = quick_sort($right);//继续处理比对右边的数组
    17     //将所有结果合并在一起组成每个阶段的有一定顺序的数组返回
    18     return array_merge($left, array($arr[0]), $right);
    19 }
    20 
    21 $arr = [5,2,4,7,8,5,4,2,6,8];
    22 //调用
    23 print_r(quick_sort($arr));
  • 相关阅读:
    [USACO4.2]草地排水Drainage Ditches
    bzoj3236:[AHOI2013]作业
    小A买彩票-(组合数)
    CSS样式整理大全
    P1880 [NOI1995]石子合并-(环形区间dp)
    P1147连续自然数和-(尺取法)
    POJ2456Aggressive cows-(二分判定)
    NYOJ737石子合并(二)-(区间dp)
    牛客网-乌龟跑步-(dfs)
    int和string之间的转换
  • 原文地址:https://www.cnblogs.com/leafinwind/p/10303338.html
Copyright © 2011-2022 走看看