冒泡与快速排序总结
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); }

浙公网安备 33010602011771号