• 排序算法,以php为代码示例


    一、冒泡排序

    <?php
    /**
    * Created by PhpStorm.
    * User: 郑楚周
    * Date: 2018/9/28
    * Time: 16:10
    */

    /**冒泡排序
    * Class Bubble
    */
    class Bubble implements sort
    {
    /**冒泡排序
    * @param $arr
    */
    public function sort($arr)
    {
    $count = count($arr);
    if($count <= 0) return '不能为空数组';

    for($i = ($count - 2); $i >= 0; $i--) {
    for ($j = 0; $j <= $i; $j++) {
    if($arr[$j] > $arr[$j+1]) {
    $tmp = $arr[$j];
    $arr[$j] = $arr[$j+1];
    $arr[$j+1] = $tmp;
    }
    }
    }
    return $arr;
    }
    }

    二、选择排序
    <?php
    /**
    * Created by PhpStorm.
    * User: 郑楚周
    * Date: 2018/9/28
    * Time: 16:10
    */

    /**选择排序
    * Class Select
    */
    class Select implements sort
    {
    public function sort($arr)
    {
    $count = count($arr);
    for ($i = 0; $i < $count; $i++) {
    $minIndex = $i;
    for ($j = $i + 1; $j < $count; $j++) {
    if ($arr[$minIndex] > $arr[$j]) {
    $minIndex = $j;
    }
    }
    helper::swap($arr[$i], $arr[$minIndex]);
    }
    return $arr;
    }
    }
    三、插入排序
    <?php
    /**
    * Created by PhpStorm.
    * User: 郑楚周
    * Date: 2018/10/5
    * Time: 16:43
    */

    /**插入排序
    * Class Insert
    */
    class Insert implements sort
    {
    /**版本1
    * @param $arr
    * @return mixed
    */
    /* public function sort($arr)
    {
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) {
    for ($j = $i; $j > 0 && $arr[$j] < $arr[$j - 1]; $j--) {
    helper::swap($arr[$j], $arr[$j - 1]);
    }
    }
    return $arr;
    }*/

    /**版本2
    * @param $arr
    * @return mixed
    */
    public function sort($arr)
    {
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) {
    $tmp = $arr[$i];
    for ($j = $i; $j > 0 && $tmp < $arr[$j - 1]; $j--) {
    $arr[$j] = $arr[$j - 1];
    }
    $arr[$j] = $tmp;
    }
    return $arr;
    }
    }
    四、归并排序
    <?php
    /**
    * Created by PhpStorm.
    * User: 郑楚周
    * Date: 2018/10/5
    * Time: 19:26
    */

    /**归并排序
    * Class Merge
    */
    class Merge implements sort
    {
    /**自上向下归并排序
    * @param $arr
    */
    public function sort($arr)
    {
    $this->__mergeSort($arr, 0, count($arr) - 1);
    return $arr;
    }

    /**自下向上归并排序
    * @param $arr
    */
    public function sortBu($arr)
    {
    $count = count($arr);
    for ($sz = 1; $sz <= $count; $sz += $sz) {
    for ($i = 0; $i < $count - $sz; $i += 2*$sz) {
    $this->__merge($arr, $i, $i + $sz - 1, helper::min($i + 2*$sz - 1, $count - 1));
    }
    }
    return $arr;
    }

    private function __mergeSort(&$arr, $left, $right)
    {
    if ($left >= $right) {
    return;
    }
    $mid = floor(($left + $right)/2);
    $this->__mergeSort($arr, $left, $mid);
    $this->__mergeSort($arr, $mid + 1, $right);
    if ($arr[$mid] > $arr[$mid + 1])
    $this->__merge($arr, $left, $mid, $right);
    }

    /**将$arr[$left]~$arr[$mid]和$arr[$mid + 1]~$arr[$right]两部分进行归并
    * @param $arr
    * @param $left
    * @param $mid
    * @param $right
    */
    private function __merge(&$arr, $left, $mid, $right)
    {
        $tmpArr = $arr;
        for ($k = $left, $i = $left, $j = $mid + 1; $k <= $right; $k++) {
        if ($i > $mid) {
        $arr[$k] = $tmpArr[$j++];
        } elseif ($j > $right) {
        $arr[$k] = $tmpArr[$i++];
        } elseif ($tmpArr[$i] < $tmpArr[$j]) {
        $arr[$k] = $tmpArr[$i++];
        } else { // $tmpArr[$i] >= $tmpArr[$j]
        $arr[$k] = $tmpArr[$j++];
        }
        }
        }
    }

    五、快速排序
    <?php
    /**
    * Created by PhpStorm.
    * User: 郑楚周
    * Date: 2018/10/6
    * Time: 11:02
    */
    class Quick implements sort
    {
    /**
    * @param $arr
    * @return mixed
    */
    public function sort($arr)
    {
    $this->__quick($arr, 0, count($arr) - 1);
    return $arr;
    }

    /**
    * @param $arr
    * @param $l
    * @param $r
    */
    private function __quick(&$arr, $l, $r)
    {
    if ($l >= $r)
    return;

    $p = $this->__partition($arr, $l, $r);
    $this->__quick($arr, $l, $p);
    $this->__quick($arr, $p + 1, $r);
    }

    /**遍历$l+1到$r,每个值和$l的值比较,将数值小的放在数组左侧,大的放在右侧,最后在将$l对应的值和$j对应的值交换位置
    * @param $arr
    * @param $l
    * @param $r
    * @return mixed
    */
    private function __partition(&$arr, $l, $r)
    {
    $v = $arr[$l];
    $j = $l;
    for ($i = $l + 1; $i <= $r; $i++) {
    if ($arr[$i] < $v)
    helper::swap($arr[$i], $arr[++$j]);
    }
    helper::swap($arr[$l], $arr[$j]);
    return $j;
    }
    }

    六、排序效率对比如下

    
    
  • 相关阅读:
    特效优化
    Jsp
    JRebel 热部署
    mysql
    行为树
    Medium | LeetCode 139. 单词拆分 | 动态规划
    Medium | LeetCode 31. 下一个排列
    Easy | LeetCode 27. 移除元素 | 快慢指针
    Medium | LeetCode 437. 路径总和 III | 树 + 回溯 + 前缀和
    Medium | LeetCode 337. 打家劫舍 III | 树后序遍历 + 动态规划
  • 原文地址:https://www.cnblogs.com/zhengchuzhou/p/9747768.html
Copyright © 2020-2023  润新知