排序算法之快速排序

快排简介: 快速排序是一种基于分治技术的重要排序算法,是冒泡算法的一种改进。是由东尼.霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要O(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快排原理:快速排序用分治的思想,将一个整串分为两个子串。左边子串中所有的数都不会大于右边子串中的数。
          步骤为:(1)从数组中挑选一个数作为“中轴”,(选择中轴有许多不同的策略,不过我们一般会选择数组的第一个元素)。
                       (2)重新排列数组,使得所有比中轴小的元素放在中轴的左边,所有比中轴大的元素放在中轴的右边,中轴元素放在中间。当然,跟中轴相等的数放在哪边都无所谓。
                       (3)按上述步骤递归执行新生成的子串。
          递归的最底层是零个或者一个数,也就说是已经排好序的。
代码实现:
 1.数据实现:
<?php

function quickSort($arr) {
    $len = count($arr);
    if ($len <= 1) {
        return $arr;
    }
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();

    for ($i = 1; $i < $len; $i++) {
        if ($arr[$i] <= $key) {
            $left_arr[] = $arr[$i];
        } else {
            $right_arr[] = $arr[$i];
        }
    }
    $left_arr = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}

$arr = array(49, 38, 2, 65, 97, 76, 13, 27);
print_r(quickSort($arr));
?>

2.循环实现:

<?php

/* 快速排序
 * @param $arr    待排序数组
 * @param $start    排序的开始坐标
 * @param $end    排序数组的结束坐标
 */

function quickSort(Array &$arr, $start, $end) {
    $low = $start;
    $high = $end;
    #同时移动low和high,low找比$arr[$start]大的元素,high找比$arr[$start]小的元素
    #交换大小元素位置,知道low=high
    while ($low != $high) {
        while ($arr[$low] <= $arr[$start] && $low != $high) {
            ++$low;
        }
        while ($arr[$high] >= $arr[$start] && $low != $high) {
            --$high;
        }
        $temp = $arr[$low];
        $arr[$low] = $arr[$high];
        $arr[$high] = $temp;
    }
    #如果low和high指向的元素小于$arr[$start],交换$arr[$start]和这个元素
    #否则交换$arr[$start]和low指向的前一个元素,然后进入递归
    if ($low != $start && $arr[$low] > $arr[$start]) {
        $low--;
    }
    $temp = $arr[$low];
    $arr[$low] = $arr[$start];
    $arr[$start] = $temp;

    #递归中止条件是切分后的部分只剩下一个元素
    if ($low - 1 > $start)
        quickSort($arr, $start, $low - 1);
    if ($low + 1 < $end)
        quickSort($arr, $low + 1, $end);
}

$arr = array(8, 3, 2, 9, 7, 1, 5);
quickSort($arr, 0, count($arr) - 1);

print_r($arr);
?>

算法分析:

   快排平均效率O(nlogn),最好情况O(nlogn),最坏情况是当数组有序时,退化成O(n^2)

posted @ 2013-09-27 16:05  独孤舞  阅读(202)  评论(0)    收藏  举报