冒泡与快速排序总结

1、冒泡排序

  

$arr = array(4,9,1,3,7,2,6,10,5,8);
$result = bubble_sort($arr);
print_r($result);
function bubble_sort($arr){
    //验证传入值是不是数组
    if(!is_array($arr)) return false;
    $len = count($arr);
    for($i = 0 ; $i < $len; $i ++){
        for($j = 0 ; $j < $len - $i -1; $j++ ){
            if($arr[$j] < $arr[$j+1]){ //这里可以控制排序,如:< 倒序 ; >正序
                $temp = $arr[$j+1];
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
    return $arr;
}

 

 

2、快速排序

  根据下面数据按照要求把语、数、外成绩总和从高到底列出前十名,如果有任意一科低于80分,则不计入排名。

$arr = array(
    '0' => array('name'=>'露娜','chinese'=>'81','maths'=>'97','english'=>'85'),
    '1' => array('name'=>'张三','chinese'=>'97','maths'=>'93','english'=>'95'),
    '2' => array('name'=>'阿珂','chinese'=>'56','maths'=>'58','english'=>'68'),
    '3' => array('name'=>'项羽','chinese'=>'82','maths'=>'77','english'=>'87'),
    '4' => array('name'=>'张飞','chinese'=>'45','maths'=>'96','english'=>'67'),
    '5' => array('name'=>'曹操','chinese'=>'59','maths'=>'75','english'=>'87'),
    '6' => array('name'=>'鲁班','chinese'=>'88','maths'=>'88','english'=>'48'),
    '7' => array('name'=>'后羿','chinese'=>'62','maths'=>'84','english'=>'68'),
    '8' => array('name'=>'狄仁杰','chinese'=>'71','maths'=>'82','english'=>'80'),
    '9' => array('name'=>'马可波罗','chinese'=>'42','maths'=>'48','english'=>'74'),
    '10' => array('name'=>'程咬金','chinese'=>'57','maths'=>'97','english'=>'64'),
    '11' => array('name'=>'东皇太一','chinese'=>'67','maths'=>'59','english'=>'87'),
    '12' => array('name'=>'孙悟空','chinese'=>'58','maths'=>'76','english'=>'64'),
    '13' => array('name'=>'咸鱼','chinese'=>'75','maths'=>'88','english'=>'99'),
    '14' => array('name'=>'皎月','chinese'=>'28','maths'=>'83','english'=>'35'),
    '15' => array('name'=>'凯','chinese'=>'23','maths'=>'58','english'=>'54'),
    '16' => array('name'=>'李白','chinese'=>'79','maths'=>'79','english'=>'98'),
    '17' => array('name'=>'貂蝉','chinese'=>'56','maths'=>'85','english'=>'78'),
    '18' => array('name'=>'兰陵王','chinese'=>'77','maths'=>'79','english'=>'89'),
    '19' => array('name'=>'火舞','chinese'=>'89','maths'=>'99','english'=>'91'),
    '20' => array('name'=>'鬼谷','chinese'=>'99','maths'=>'85','english'=>'97')
);

//第一种方案
 foreach ($data as $key => $row) {
            if($row['chinese'] >= 80 && $row['maths'] >= 80 && $row['english'] >= 80){
                $volume[$key]  = $row['chinese']+$row['maths']+$row['english']; //进行统计
            }else{
                unset($data[$key]); //去掉不符合标准的人
            }
        }

        array_multisort($volume, SORT_DESC, $data);//对数组进行排序
        dump(array_slice($data,0,10));  //如果超过十个人就截取前十名

//第二种方案
$result = quick_sort($arr);
print_r(array_slice($result,0,10)); //截取数组长度,超出只输出前十位

function quick_sort($arr){
    //验证传入值是不是数组
    if(!is_array($arr)) return false;
    $len = count($arr);
    //数组长度小于或等于1的话直接返回
    if($len <= 1) return $arr;
    $left = $right = array();
    for($i = 1 ; $i < $len ; $i ++){    //从数组中第二条数据开始循环
        if($arr[$i]['chinese'] >= 80 && $arr[$i]['maths'] >= 80 && $arr[$i]['english'] >= 80){  //判断三门是否都大于80
            $sum     = $arr[$i]['chinese'] + $arr[$i]['maths'] + $arr[$i]['english'];
            $sum_one = $arr[0]['chinese'] + $arr[0]['maths'] + $arr[0]['english'];
            if($sum_one > $sum){
                $left[] = $arr[$i];
            } else {
                $right[] = $arr[$i];
            }
        }
    }
    $left = quick_sort($left);
    $right = quick_sort($right);
    return array_merge($left,array($arr[0]),$right);
}

 



 

posted @ 2018-03-01 15:48  Mr*wang  阅读(141)  评论(0)    收藏  举报