<?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);
?>
转载于:https://my.oschina.net/u/932154/blog/99747