1、冒泡算法:把最小的或者最大值放到数据的第一位
function maopao($arr){
$total=count($arr);
for($i=0;$i<$total;$i++){
for($j=$total-1;$j>$i;$j--){
if($arr[$j]<$arr[$j-1]){
$x=$arr[$j-1];
$arr[$j-1]=$arr[$j]
$arr[$j]=$x;
}
}
return $arr;
}
}
2、快速排序:以其中某个之为临界点,把整个数据分为两边,一边大于,一边小于,然后进行合并
public static function fast_sort($arr, $type = 'asc') {
if (!is_array($arr) || empty($arr))
return $arr;
$arr = array_merge($arr);
$total = count($arr);
if($total==1)
return $arr;
$first = $arr[0];
$left_arr = array();
$right_arr = array();
for ($i = 1; $i < $total; $i++) {
if ($arr[$i] > $first)
$right_arr[] = $arr[$i];
else
$left_arr[] = $arr[$i];
}
$left_arr = XUtil::fast_sort($left_arr);
$right_arr = XUtil::fast_sort($right_arr);
if($type == 'asc')
return array_merge($left_arr, array($first), $right_arr);
else
return array_merge($right_arr, array($first),$left_arr );
}
3、二分查找:前提,该数组已经是一个有序数组,必须先排序,再查找。
functionbinarySearch(&$array,$findVal,$leftIndex,$rightIndex){
$middleIndex=round(($rightIndex+$leftIndex)/2);
if($leftIndex>$rightIndex){
echo'查无此数<br/>';
return;
}
if($findVal>$array[$middleIndex]){
binarySearch($array,$findVal,$middleIndex+1,$rightIndex);
}elseif($findVal<$array[$middleIndex]){
binarySearch($array,$findVal,$leftIndex,$middleIndex-1);
}else{
echo"找到数据:
index=$middleIndex;value=$array[$middleIndex]<br/>";
if($array[$middleIndex+1]==$array[$middleIndex]&&$leftIndex<$rightIndex){
binarySearch($array,$findVal,$middleIndex+1,$rightIndex);
}
if($array[$middleIndex-1]==$array[$middleIndex]&&$leftIndex<$rightIndex){
binarySearch($array,$findVal,$leftIndex,$middleIndex-1);
}
}
}
4、直接排序
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
public static function insert_sort($arr, $type = 'asc') {
if (!is_array($arr))
return;
$arr = array_merge($arr);
$total = count($arr);
if ($type == 'asc') {
for ($i = 1; $i < $total; $i++) {
for ($j = $i - 1; $j >= 0 && $arr[$j] > $arr[$j + 1]; $j--) {
$tmp = $arr[$j + 1];
$arr[$j + 1] = $arr[$j];
$arr[$j] = $tmp;
}
}
} else {
for ($i = 1; $i < $total; $i++) {
for ($j = $i - 1; $j >= 0 && $arr[$j] < $arr[$j + 1]; $j--) {
$tmp = $arr[$j + 1];
$arr[$j + 1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
5、希尔排序
希尔排序的基本思想是:将需要排序的序列划分成为若干个较小的子序列,对子序列进行插入排序,通过则插入排序能够使得原来序列成为基本有序。这样通过对较小的序列进行插入排序,然后对基本有序的数列进行插入排序,能够提高插入排序算法的效率。
public static function shell_sort($arr, $type = 'asc') {
$arr = array_merge($arr);
$total = count($arr);
for ($gap = floor($total / 2); $gap > 0; $gap = floor( $gap/ 2) ) {
for ($i = $gap; $i < $total; $i++) {
if($type=='asc'){
for ($j = $i - $gap; $j >= 0 && $arr[$j] > $arr[$j + $gap]; $j -= $gap) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j + $gap];
$arr[$j + $gap] = $tmp;
}
}else{
for ($j = $i - $gap; $j >= 0 && $arr[$j] < $arr[$j + $gap]; $j -= $gap) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j + $gap];
$arr[$j + $gap] = $tmp;
}
}
}
}
return $arr;
}