基础排序法


class Sort
{

    public $array = [1, 22, 21, 23, 4, 5, 25, 6];
    /**
     * 快排算法
     * @param array $arr
     * @return int[]
     */
    public function quickSort($arr = []): array
    {
        //1.从数组中挑出一个数作为基准元素,通常第一个或者最后一个元素;
        //2.扫描数组,以基准元素为比较对象,把数组分成两个区,小的移动到基准元素前面,大的移到后面,相等的前后都可以,基准元素处于数组的中间部分;
        //3.然后再用同样的方法,递归的排序划分两部分
        $len = count($arr);
        if ($len <= 1) {        //设定结束条件
            return $arr;
        }
        //选择第一个元素作为基准元素
        $pivot = $arr[0];
        $left = $right = [];    //初始化左右数组
        for ($i = 1; $i < $len; $i++) {            //遍历整个数组
            if ($arr[$i] < $pivot) {        //假设循环中每个$i的值小于基准元素
                $left[] = $arr[$i];         //放置在左数组
            } else {
                $right[] = $arr[$i];        //大于放置右数组
            }
        }
        //再用同样的方法,递归的排序划分两部分
        $left = $this->quickSort($left);
        $right = $this->quickSort($right);
        //合并基准元素,和左右数组
        return array_merge($left, array($pivot), $right);
    }

    /**
     * 冒泡排序
     */
    public function bubbleSort(): array
    {
        //从第一个元素,比较相邻的元素,如果第一个比第二个大,就交换位置;一直持续交换,直到交换次数越来越少,排序结束;
        $len = count($this->array);
        for ($i = 1; $i < $len; $i++) {     //遍历所有数组的值
            for ($k = 0; $k < $len - $i; $k++) {            //比较循环轮数
                if ($this->array[$k] > $this->array[$k + 1]) {      //假设每轮第$k元素大于$k后面的元素,交互位置
                    $temp = $this->array[$k + 1];
                    $this->array[$k + 1] = $this->array[$k];
                    $this->array[$k] = $temp;
                }
            }
        }
        return $this->array;
    }

    /**
     * 选择排序
     * @param array $arr
     * @return array
     */
    public function selectSort(&$arr = []): array
    {
        //在排序的一组数中,选出最小的一个数与第一个位置交换,直到在剩下的数当中在找最小的与第二个位置交换
        //如此循环到倒数第二个数和最后一个数比较为止。
        $len = count($this->array);
        for ($i = 0; $i < $len - 1; $i++) {
            $p = $i;        //假设最小的值得位置
            for ($j = $i + 1; $j < $len; $j++) {
                if ($arr[$p] > $arr[$j]) {
                    $p = $j;        //比较下更小的,记录最小值的位置
                }
            }
            if ($p != $i) {      //确定当前最小位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
                $temp = $arr[$p];
                $arr[$p] = $arr[$i];
                $arr[$i] = $temp;
            }
        }
        return $arr;
    }
}

$rs = new Sort();
//快排算法
$arr = [1, 22, 21, 23, 4, 5, 25, 6];
//print_r($rs->quickSort($arr));

//冒泡排序
//print_r($rs->bubbleSort());

//选择排序
//print_r($rs->selectSort($arr));
posted @ 2021-04-18 11:35  惊风破浪的博客  阅读(44)  评论(0编辑  收藏  举报