C语言 c++ php mysql nginx linux lnmp lamp lanmp memcache redis 面试 笔记 ppt 设计模式 问题 远程连接

排序

 

效率比较:冒泡<选择<插入<快速

 

4:快速排序


/**

 * 随便取一个数,每循环一次则把比他小的放到左边,比他大的放到右边,递归完成
 * @param array $seq

 * @return array
 
*/
function quicksort($seq) {
    if (count($seq) > 1) {
        $k = $seq[0];
        $x = array();
        $y = array();
        $_size = count($seq);      //do not use count($seq) in loop for.
        for ($i=1; $i<$_size$i++) {
            if ($seq[$i] <= $k) {
                $x[] = $seq[$i];
            } else {
                $y[] = $seq[$i];
            }
        }
        $x = quicksort($x);
        $y = quicksort($y);
        return array_merge($xarray($k), $y);
    } else {
        return $seq;
    }
}

 

3:插入排序

 

$arr = array(3,2,1);
//把数组的前半部分看做是有序的,后面的不断的往前面插入
function insert_sort(&$arr)
{
    //先默认下标为0 这个数已经是有序
    for($i=1;$i<count($arr);$i++)
    {
        //$insertValue 是准备插入的数
        $insertValue = $arr[$i];
        //先准备和$insertIndex比较
        $inserIndex = $i-1;
        
        //如果满足这个条件,说明我们没有找到合适的位置、
        
        while($inserIndex>=0 && $insertValue<$arr[$inserIndex])
        {
            //同时把数相应往后面移动
            $arr[$inserIndex+1] = $arr[$inserIndex];
            $inserIndex--;
        }
        
        //插入(这时就给$insertValue找到适当的位置)
        $arr[$inserIndex+1] = $insertValue;//之所以+1 是因为 $inserIndex 是插入的前一个数,即每次和他比较的那个数
    }
}

insert_sort($arr);

print_r($arr);

2:选择排序

$arr = array(1,2,3);
/**
 * 取一个数依次和后面的做比较,记录本次的最小值,然后交换位置
 * 
 
*/
function select_sort(&$arr)
{
    $nums = count($arr)-1;//外层循环次数
    $temp = 0;//交换变量用的临时变量
    for($i=0;$i<$nums;$i++)
    {
        $minValue = $arr[$i];//假设$i就是最小数
        $minIndex = $i;     //记录我认为的最小数的下标
        //每排好一个,以后就可以少循环一回

        for($j=$i+1;$j<$nums;$j++)
        {
            if($minValue>$arr[$j])
            {
                $minIndex = $j;
                $minValue = $arr[$j];
            }
        }
        
        //交换位置
        $temp = $arr[$i];
        $arr[$i] = $arr[$minIndex];
        $arr[$minIndex] = $temp;
    }
}

select_sort($arr);

print_r($arr); 

 

 

1.冒泡排序

 

$arr = array(3,2,1);
//外层每循环一次则找出一个最大值,放到后面,所以里层的循环就可以减少一次

function bubble_sort(&$arr)
{
   $flag = false;

   $nums = count($arr)-1;//外层循环次数$temp = 0;//变量交换位置
   for($i=0;$i<$nums;$i++)
    {
        //每排好一个,以后就可以少循环一回
        for($j=0;$j<$nums-$i;$j++)
        {
            if($arr[$j]>$arr[$j+1])
            {
                //交换位置
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;

                $flag = true;//以次来判断是否进入过次层,如果没有进入过,说明本来就是个有序的,无需进行排序了

            }
        }

        if(!$flag){
            //已经排好了
            break;
        }else{
            $flag = false;
        }

    }
}

bubble_sort($arr);

print_r($arr);
posted on 2012-09-01 22:32  思齐_  阅读(234)  评论(0编辑  收藏  举报