PHP排序算法系列:快速排序

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C.A.R.Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

原理

快速排序采用的思想是分治思想。

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

实现方法

(1)在数据集之中,选择一个元素作为”基准”(pivot)。
(2)所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。
(3)对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例

对数组[53,89,12,98,25,37,92,5]进行排序

1.选择第一个元素53作为基准。

==53==,89,12,98,25,37,92,5

2.从左到右,将每个元素与”基准”进行比较,形成两个子集。

12,25,37,5,==53==,89,98,92

3.对两个子集重复1,2操作,直到所有子集元素只剩下一个元素为止。

(5,==12==,25,37),53,(==89==,98,92)

5,12,(25,37),53,89,(98,92)

5,12,25,37,53,89,92,98

PHP代码实现

function quick_sort($arr){
    $length=count($arr);
    if($length<=1){
        return $arr;
    }
    $left=$right=array();
    //将$arr[0]作为基准值
    $pivot=$arr[0];
    for ($i=1; $i <$length ; $i++) {
        if($arr[$i]<$pivot){
            $left[]=$arr[$i];
        }else{
            $right[]=$arr[$i];
        }
    }
    return array_merge(quick_sort($left),(array)$pivot,quick_sort($right));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章