PHP实现各类排序

274 阅读1分钟
<?php
/**
 * 常用排序类
 * @author dj
 */
namespace sort;

class Sort{
    /**
     * 插入排序
     */
    public static function insertSort($params = array())
    {
        $i = $j = $l = 0;
        $r = count($params) - 1;

        for ($i = $l + 1; $i <= $r; $i++) {
            for ($j = $i; $j > $l; $j--) {
                if ($params[$j - 1] > $params[$j]) {
                    $temp = $params[$j - 1];
                    $params[$j - 1] = $params[$j];
                    $params[$j] = $temp;
                }
            }
        }

        return $params;
    }

    /**
     * 插入排序升级
     */
    public static function insertSortUp($params = array())
    {
        $l = 0;
        $r = count($params) - 1;

        for ($i = $r; $i > $l; $i--) {
            if ($params[$i - 1] > $params[$i]) {
                $temp = $params[$i - 1];
                $params[$i - 1] = $params[$i];
                $params[$i] = $temp;
            }
        }

        for ($i = $l + 2; $i <= $r; $i++) {
            $j = $i;
            $v = $params[$i];
            // 前面一轮已经有序,将新增元素对比有序数组,找到合适位置以替换
            while ($v < $params[$j - 1]) {
                $params[$j] = $params[$j - 1];
                $j--;
            }
            $params[$j] = $v;
        }

        return $params;
    }

    /**
     * 选择排序
     */
    public static function selectSort($params = array())
    {
        $l = 0;
        $r = count($params) - 1;

        for ($i = $l; $i <= $r; $i++) {
            $min = $i;
            //每次取循环体内最小值,赋值给$params[$i];
            for ($j = $i + 1; $j <= $r; $j++) {
                if ($params[$j] < $params[$min]) {
                    $min = $j;
                }
            }
            $temp = $params[$i];
            $params[$i] = $params[$min];
            $params[$min] = $temp;
        }

        return $params;
    }

    /**
     * 冒泡排序
     */
    public static function bubbleSort($params = array())
    {
        $l = 0;
        $r = count($params) - 1;

        //依次沉底
        for ($i = $l; $i < $r; $i++) {
            for ($j = $r; $j > $i; $j--) {
                if ($params[$j] < $params[$j - 1]) {
                    $temp = $params[$j];
                    $params[$j] = $params[$j - 1];
                    $params[$j - 1] = $temp;
                }
            }
        }

        return $params;
    }

    /**
     * 冒泡排序升级,避免每次转换
     */
    public static function bubbleSort1($params = array())
    {
        $l = 0;
        $r = count($params) - 1;

        for ($i = $r; $i >= 0; $i--) {
            $k = 0;
            //拿当前范围内最大值,赋值给$params[$i];
            for ($j = 0; $j <= $i; $j++) {
                if ($params[$j] > $params[$k]) {
                    $k = $j;
                }
            }
            $temp = $params[$k];
            $params[$k] = $params[$i];
            $params[$i] = $temp;
        }

        return $params;
    }

    /**
     * 希尔排序
     * grap = $r/2 .. grap = grap/2。步长是grap,且分成grap组,再对每组,组内进行插入排序。依次反复
     */
    public static function shellSort($params = array())
    {
        $l = $h = 0;
        $r = count($params) - 1;

        for ($gap = floor(count($params) / 2); $gap > 0; $gap = floor($gap / 2)) {
            var_dump($gap);
            for ($i = 0; $i < $gap; $i++) {
                for ($j = $i + $gap; $j <= $r; $j += $gap) {
                    if ($params[$j] < $params[$j - $gap]) {
                        $temp = $params[$j];
                        $k = $j - $gap;
                        while ($k >= 0 && $params[$k] > $temp) {
                            $params[$k + $gap] = $params[$k];
                            $k -= $gap;
                        }
                        $params[$k + $gap] = $temp;
                    }
                }
                var_dump($params);
            }
        }

        return $params;
    }

    /**
     * 快速排序 - 递归,按大于或小余基准值归类
     */
    function quickSort($params = array())
    {
        $r = count($params);
        if ($r <= 1) {
            return $params;
        }

        $v = $params[0];
        $low = $up = array();
        for ($i = 1; $i < $r; ++$i) {
            if ($params[$i] > $v) {
                $up[] = $params[$i];
            } else {
                $low[] = $params[$i];
            }
        }
        $low = $this->quickSort($low);
        $up = $this->quickSort($up);

        return array_merge($low, array($v), $up);
    }
}
?>
  • composer require dj007/algorithm @dev

基础算法学习记录~