ITPub博客

首页 > IT职业 > IT生活 > 【我就瞎记记,你就瞎看看】小算法-快速排序

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

IT生活 作者:zhjjj 时间:2021-09-09 08:59:48 0 删除 编辑

快速排序

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

  • 定义左右两侧的起始数和终止数,一般是以数组起始值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

  • 右侧还要进行排列,$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];

代码:

= $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] 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/717/viewspace-2798398/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    231
  • 访问量
    1890