继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【我就瞎记记,你就瞎看看】小算法-快速排序

MonKing__
关注TA
已关注
手记 4
粉丝 5
获赞 55

快速排序

  • 定义一个基准数,用于做参照。

  • 定义左右两侧的起始数和终止数,一般是以数组起始值0,以及数组长度-1为开始

  • 数组【0】开始,与基准数X进行判断,如果比X ==大==,则停止,保留数组【0】;

    比X ==小==,则数组【0】变成数组【1】(即向右移动一位),再与基准数X判断,如此

    循环,到符合前面条件停止。

  • 数组【长度-1】开始,与基准数X进行判断,如果比X==小==,则停止,保留数组【长度-1】;

    比X ==大==,则数组【长度-1】变成数组【长度-2】(即向左移动一位),再与基准数

    X判断,如此循环,到符合前面条件停止。


例如:

  • 现在有数组$arr = [12, 6, 5, 35, 64, 78, 11, 85, 43,46];

  • 我们取$arr[0]=12为基准数$temp。(这边如果设置基准数是最左边的,则让右侧先开始判断值,如果基准数设置是最右边的数,则让左侧开始先判断)
  • 定义变量$i=0; $j=9(数组长度-1);

  • 然后从$arr[$j]先开始进行判断,如果不符合条件则$j--; $j会在$arr[6]=11位置停下。
  • $arr[$i]开始进行判断,如果不符合条件则$i--; $i会在$arr[3]=35位置停下。

  • $arr[3]与$arr[6]互换。
  • 更换完,数组是$arr = [12, 6, 5, 11, 64, 78, 35, 85, 43,46];

  • 更换完以后,右侧的$j继续先判断,从$j=6开始往左走,此时$i=3
  • $j此轮一直与$i=3的位置相遇,当两者相遇的时候,则将相遇位置($i=$j)的数与基准数$temp=12进行互换。

  • 更换完,数组是$arr = [11, 6, 5, 12, 64, 78, 35, 85, 43,46];

  • 此时,基于$arr[3]这个位置,将数组拆分为左右两次数组,进行相同的方式判断(这里会用到递归的方法)。
  • 左侧数组为 $left_arr=[11,6,5]; 右侧数组为 $right_arr=[64,78,35,85,43,46];

  • 左侧数组用上述方法进行排列,变成 $left_arr=[5,6,11];
  • 右侧数组用上述方法进行排列,首先变成$right_arr=[43,46,35,64,85,78];

  • 这时,左侧已经不需要排列了,因为$temp=11基准数归位后,右侧没有数组,左侧5<6

  • 右侧还要进行排列,$temp=64基准数归位后,左边数组为[43,46,35],右边数组[85,78]
  • 最终右侧会变成$right_arr=[35,43,46,64,78,85];

  • 最终数组$arr=[5,6,11,12,35,43,46,64,78,85];

代码:

<?php
//准备数据样本
$arr = [12, 6, 5, 35, 64, 78, 11, 85, 43, 46];

function quickSort($left, $right)
{
    //php函数内调用全局变量$arr
    global $arr;

    if ($left >= $right) {
        return;
    }

    //设置基准数,作为比较用的参数
    $temp = $arr[$left];

    //$i是左边起的起始数值,$j是右边起的起始数值
    $i = $left;
    $j = $right;

    //只要两个参数不相等,即两者不是指向同一个数组内参数 则继续循环
    while ($i != $j) {

        //从数组右侧开始,判断是否比基准数小并且($j>$i)确保从右往左且还未与$i相遇
        while ($arr[$j] >= $temp && $j > $i) {
            $j--;
        }

        //从数组左侧开始,判断是否比基准数大并且($j>$i)确保从左往右且还未与$j相遇
        while ($arr[$i] <= $temp && $i < $j) {
            $i++;
        }

        /**上述两个判断条件停止时,$i,$j都会指向数组内的某个数$arr[$i],$arr[$j]
         *并且$arr[$i]是比基准数大的,$arr[$j]是比基准数小的
         *两者的值进行互换
         */
        if ($i < $j) {
            $t = $arr[$i];
            $arr[$i] = $arr[$j];
            $arr[$j] = $t;
        }
    }

    //当$i,$j两个参数相等时候,则跳出循环,并且将基准数与数组中(当$j=$i时)$arr[$i]内的值进行互换。
    $arr[$left] = $arr[$i];
    $arr[$i] = $temp;

    //利用递归,将$i=$j的数组参数左侧进行判断归位,右侧进行判断归位,最终返回结果。
    quickSort($left, $i - 1);
    quickSort($i + 1, $right);

    return;

}

quickSort(0, count($arr) - 1);
print_r($arr);
打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP