<?php //简单的 //现在我们把冒泡法封装成函数,利用以后使用 function bubbleSort(&$myarr){ //这是一个中间变量 $temp=0; //我们要把数组,从小到大 //外层循环 $flag=false; for($i=0;$i<count($myarr)-1;$i++){ for($j=0;$j<count($myarr)-1-$i;$j++){ //说明前面的数比后面的数大,就要交换 if($myarr[$j]>$myarr[$j+1]){ $temp=$myarr[$j]; $myarr[$j]=$myarr[$j+1]; $myarr[$j+1]=$temp; $flag=true; } } //判断 if(!$flag){ //已经是有序 break; } $flag=false; } echo "<br/>函数中的myarr数组"; print_r($myarr); } //选择排序法 function selectSort(&$arr){ $temp=0; for($i=0;$i<count($arr)-1;$i++){ //假设 $i就是最小的数 $minVal=$arr[$i]; //记录我认为的最小数的下标 $minIndex=$i; for($j=$i+1;$j<count($arr);$j++){ //说明我们认为的最小值,不是最小 if($minVal>$arr[$j]){ $minVal=$arr[$j]; $minIndex=$j; } } //最后交换 $temp=$arr[$i]; $arr[$i]=$arr[$minIndex]; $arr[$minIndex]=$temp; } } //数组排序 //插入排序法(小->大) function insertSort(&$arr){ //先默认下标为0 这个数已经是有序 for($i=1;$i<count($arr);$i++){ //$insertVal是准备插入的数 $insertVal=$arr[$i]; //准备先和$insertIndex比较 $insertIndex=$i-1; //如果这个条件满足,说明,我们还没有找到适当的位置 while($insertIndex>=0&&$insertVal<$arr[$insertIndex]){ //同时把数后移 $arr[$insertIndex+1]=$arr[$insertIndex]; $insertIndex--; } //插入(这时就给$insertVal找到适当位置) $arr[$insertIndex+1]=$insertVal; } } //这个是快速排序. function quickSort($left,$right,&$array){ $l=$left; $r=$right; $pivot = $array[($left+$right)/2]; $temp=0; while($l<$r){ while($array[$l]<$pivot) $l++; while($array[$r]>$pivot) $r--; if($l>=$r) break; $temp=$array[$l]; $array[$l]=$array[$r]; $array[$r]=$temp; if($array[$l]==$pivot) --$r; if($array[$r]==$pivot) ++$l; } if($l==$r){ $l++; $r--; } if($left<$r) quickSort($left,$r,$array); if($right>$l) quickSort($l,$right,$array); } $arr=array(0,5,-1); //使用函数去排序 //bubbleSort($arr); //使用选择排序法 //selectSort($arr); //插入排序法 insertSort($arr); //输出 print_r($arr); //二分查找函数 function binarySearch(&$arr,$findVal,$leftIndex,$rightIndex){ //当 $rightIndex>$leftIndex 说明没有数 if($rightIndex<$leftIndex){ echo "找不到该数"; return ; } //找到中间这个数 $middleIndex=round(($rightIndex+$leftIndex)/2); //如果大于则,向后面找 if($findVal>$arr[$middleIndex]){ binarySearch($arr,$findVal,$middleIndex+1,$rightIndex); } //如果是小于中间这个数,则向前面找 else if($findVal<$arr[$middleIndex]){ binarySearch($arr,$findVal,$leftIndex,$middleIndex-1); }else{ echo "找到这个数 下标是 $middleIndex"; } } //search($arr,-1); $arr=array(-2,0,90,900,99990); binarySearch($arr,-2,0,count($arr)-1); echo '<br/>'; //用系统函数排序主要有 sort,asort,ksort $data = array( "file1.txt", "file11.txt", "File2.txt", "FILE12.txt", "file.txt" ); natsort( $data ); //普通的“自然排序” print_r( $data ); //输出排序后的结果,数组中包括大小写,输出不是正确的排序结果 natcasesort( $data ); //忽略大小写的“自然排序” print_r( $data ); //输出“自然排序”后的结果,正常结果 $data = array( "l"=>"Linux", "a"=>"Apache", "m"=>"MySQL", "p"=>"PHP" ); asort( $data ); //使用asort()函数将数组$data按元素的值升序排序,并保留原有的键名和值 print_r( $data ); //输出:Array ( [a] => Apache [l] => Linux [m] => MySQL [p] => PHP ) arsort( $data ); //使用arsort()函数将数组$data按元素的值降序排序,并保留原有的键名和值 print_r( $data ); //输出:Array ( [p] => PHP [m] => MySQL [l] => Linux [a] => Apache ) rsort( $data ); //使用rsort()函数将数组$data按元素的值降序排序,但原始键名被忽略 print_r($data); //输出:Array ( [0] => PHP [1] => MySQL [2] => Linux [3] => Apache ) function sortByLen( $one, $two ) { //如果两个参数长度相等返回0,在数组中的位置不变 if ( strlen( $one ) == strlen( $two ) ) return 0; else //第一个参数大于第二个参数返回大于0的数,否则返回小于0的数 return ( strlen( $one ) > strlen( $two ) ) ? 1 : -1; } //使用usort()函数传入用户自定义的回调函数进行数组排序 usort( $lamp, "sortByLen" ); print_r( $lamp ); //声明一个$data数组,模拟了一个行和列数组 $data = array( array("id" => 1, "soft" => "Linux", "rating" => 3), array("id" => 2, "soft" => "Apache", "rating" => 1), array("id" => 3, "soft" => "MySQL", "rating" => 4), array("id" => 4, "soft" => "PHP", "rating" => 2), ); //使用foreach遍历创建两个数组$soft和$rating,作为array_multisort的参数 foreach( $data as $key => $value ) { $soft[$key] = $value["soft"]; //将$data中的每个数组元素中键值为soft的值形成数组$soft $rating[$key] = $value["rating"]; //将每个数组元素中键值为rating的值形成数组$rating } array_multisort( $rating, $soft, $data ); //使用array_multisort()函数传入三个数组进行排序 print_r( $data ); /* 排序顺序标志: ■SORT_ASC - 按照上升顺序排序 ■SORT_DESC - 按照下降顺序排序 排序类型标志: ■SORT_REGULAR - 将项目按照通常方法比较 ■SORT_NUMERIC - 将项目按照数值比较 ■SORT_STRING - 将项目按照字符串比较 */ $grade = array("score" => array(70, 95, 70.0, 60, "70"), "name" => array("Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Liu Qi")); array_multisort($grade["score"], SORT_NUMERIC, SORT_DESC,// 将分数作为数值,由高到低排序 $grade["name"], SORT_STRING, SORT_ASC);// 将名字作为字符串,由小到大排序 var_dump($grade); ?>