算法:快速排序

原理:

在一个数组中,选一个元素(通常是第一个元素或者数组的中间元素)与剩余的其它元素进行比较:建立两个分组(左组和右组),比当前元素小的放在左组,比当前元素大的放在右组。这样一来,将左组,中间组合右组合并起来就形成一个已经“排好序”的数组。实际上,左组和右组中的元素并不一定已经排好序,调用自己去排序,只有左右数组的元素个数大于1,就需要排序,如果元素个数等于一个,就不再调用函数。

 

使用递归实现(步骤):

1、实现从数组中取出一个元素:将小的放左边数组,大的放右边数组,最后返回合并结果

2、  左右两边数组有可能没有排好序:需要调用函数进行排序:函数本身就是为了给数组进行排序:调用自己解决自己的问题:递归

3、  递归开始:就必须找出递归出口:递归出口是数组的元素要小于等于1

 

<?php
//算法:快速排序

function quick_sort($arr)
{
    //在数组中取出第一个元素作为中间值
    $middle = $arr[0];
    //定义两个空数组
    $left = $right = array();
        //循环遍历,从第二个元素开始
        for($i=1,$len = count($arr);$i < $len;$i++)
        {
            //判断:比较中间值和数组中每一个元素
            if($middle > $arr[$i])
            {
                //比中间值
                $left[] = $arr[$i];
            }
            else
            {
                $right[] = $arr[$i];
            }
        }

//比较完之后,左数组和右数组不一定只有一个值,所以要对左右数组的长度进行判断,若长度大于1则需再次比较

    //判断左右数组的长度
    if(count($left)>1)
    {
        $left = quick_sort($left);
    }

    if(count($right)>1)
    {
        $right = quick_sort($right);
    }

    //合并数组左数组、中间值和右数组
    return array_merge($left,array($middle),$right);
}

//定义数组
$arr = array(6,72,65,76,5,2,83,9,23,0,68);

print_r(quick_sort($arr));

执行结果:

Array ( [0] => 0 [1] => 2 [2] => 5 [3] => 6 [4] => 9 [5] => 23 [6] => 65 [7] => 68 [8] => 72 [9] => 76 [10] => 83 )

posted @ 2015-10-10 20:34  lesuso  阅读(140)  评论(0编辑  收藏  举报