快速排序法

2018-06-01  本文已影响0人  拉风的老衲

1. 快速排序

介绍:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

步骤:

  1. 从数列中挑出一个元素,称为 “基准”(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
    20140729094606701.png
Visual-and-intuitive-feel-of-7-common-sorting-algorithms.gif

通过下面这段代码来了解下:所谓快速排序法其实运用的是分治法,将问题分解为规模更小的子问题,将这些规模更小的子问题逐个击破,将已解决的子问题合并,最终得出“母”问题的解;

function sort()
    {
        $sort = [3, 1, 2, 6, 9, 4, 7, 8, 5];
        $sort = $this->quick_sort($sort);
    }
function quick_sort($array)
    {
        if (count($array) <= 1) {
            return $array;
        }
        $key = $array[0];

        $rightArray = array();
        $leftArray = array();
        for ($i = 1; $i < count($array); $i++) {
            if ($array[$i] >= $key) {
                $rightArray[] = $array[$i];
            } else {
                $leftArray[] = $array[$i];
            }
        }
        echo "k:" . $key . "<br>";
        echo "l:" . json_encode($leftArray) . "<br>";
        echo "r:" . json_encode($rightArray) . "<br>";
        echo "<hr>";
        $leftArray = $this->quick_sort($leftArray);
        $rightArray = $this->quick_sort($rightArray);
        
        return array_merge($leftArray, array($key), $rightArray);
    }

输出结果:

k:3
l:[1,2]
r:[6,9,4,7,8,5]
-----------------------------------------
k:1
l:[]
r:[2]
-----------------------------------------
k:6
l:[4,5]
r:[9,7,8]
-----------------------------------------
k:4
l:[]
r:[5]
-----------------------------------------
k:9
l:[7,8]
r:[]
-----------------------------------------
k:7
l:[]
r:[8]
上一篇 下一篇

猜你喜欢

热点阅读