时间复杂度为O(n2)的算法:
插入排序:(先把要排序的数,拿出来,然后遍历是否存在大于该数的,有移动位置,否,继续往后)
$n = count($nu);
for($i =1;$i=0 && $temp冒泡排序:(即大的数一直往后排,需要遍历n-1次,每次需要再遍历n-1-i 次)
$n = count($nu);
for($i=0;$i$nu[$j+1])
{
$tem = $nu[$j];
$nu[$j] = $nu[$j+1];
$nu[$j+1] = $tem;
}
}
}
时间复杂度为O(nlogn)的算法:
快速排序(首先找个参考值,找到比它小的分到一个数组,找到大的分到另一个数组,然后依次找下去)重点是递归思想,每次递归完,都会把找到的数组进行排序。最后返会的是有序的数组。
function quickSort(&$arr){
if(count($arr)>1){
$k=$arr[0];
$x=array();
$y=array();
$_size=count($arr);
for($i=1;$i$k){
$y[]=$arr[$i];
}
}
$x=quickSort($x);
$y=quickSort($y);
var_dump($x);
var_dump($y);
var_dump($k);
//var_dump($y);
//var_dump(array_merge($x,array($k),$y));
return array_merge($x,array($k),$y);
}else{
return $arr;
}
}
quickSort($nu);归并排序:
$arr=array(5,3,2,4,1);
$GLOBALS['res']=0;
function merge_sort(&$arr){
$len=count($arr);
if($len==1)
return $arr;
$middle=intval($len/2);
$left=array_slice($arr,0,$middle);
$right=array_slice($arr,$middle);
merge_sort($left);
merge_sort($right);
$arr=merge($left,$right);
return $GLOBALS['res'];
}
function merge($leftarr,$rightarr){
$arr = array();
static $res = 0;
while(count($leftarr) && count($rightarr))
{
if($leftarr[count($leftarr)-1] > $rightarr[count($rightarr)-1]){
$res = $res+count($rightarr);
$GLOBALS['res'] =$res;
array_unshift($arr,array_pop($leftarr));
}else{
array_unshift($arr,array_pop($rightarr));
}
}
return array_merge($rightarr,$leftarr,$arr);
}sort函数----usort();使用自定义的函数,比较大小。
usort(array,myfunction);
参数
描述
array
必需。规定要进行排序的数组。
myfunction
可选。定义可调用比较函数的字符串。如果第一个参数小于等于或大于第二个参数,那么比较函数必须返回一个小于等于或大于 0 的整数。
$numbers = array(3,32,321);
usort($numbers, function($a,$b){
if($a>$b)return 1;
return -1;
// if("$a$b" > "$b$a") return 1;
// return -1;
});
var_dump($numbers);