//1、冒泡排序
1
2
3
4
5
6
7
8
9
10
11
12
|
function bubble_sort( $arr ){
$n = count ( $arr );
for ( $i =0; $i < $n -1; $i ++){
for ( $j = $i +1;; $j < $n - $i ; $j ++){
if ( $arr [ $j ]< $arr [ $i ]){
$temp = $arr [ $i ];
$arr [ $i ] = $arr [ $j ];
$arr [ $j ] = $temp ;
}
}
}
}
|
//2、归并排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//merge函数将指定的两个有序数组(arr1arr2,)合并并且排序
//我们可以找到第三个数组,然后依次从两个数组的开始取数据哪个数据小就先取哪个的,然后删除掉刚刚取过///的数据
function al_merge( $arrA , $arrB )
{
$arrC = array ();
while ( count ( $arrA ) && count ( $arrB )) {
//这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值,
//不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用
$arrC [] = $arrA [ '0' ] < $arrB [ '0' ] ? array_shift ( $arrA ) : array_shift ( $arrB );
}
return array_merge ( $arrC , $arrA , $arrB );
}
//归并排序主程序
function al_merge_sort( $arr )
{
$len = count ( $arr );
if ( $len <= 1) {
return $arr ; //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
}
$mid = intval ( $len / 2); //取数组中间
$left_arr = array_slice ( $arr , 0, $mid ); //拆分数组0-mid这部分给左边left_arr
$right_arr = array_slice ( $arr , $mid ); //拆分数组mid-末尾这部分给右边right_arr
$left_arr = al_merge_sort( $left_arr ); //左边拆分完后开始递归合并往上走
$right_arr = al_merge_sort( $right_arr ); //右边拆分完毕开始递归往上走
$arr = al_merge( $left_arr , $right_arr ); //合并两个数组,继续递归
return $arr ;
}
$arr = array (12, 5, 4, 7, 8, 3, 4, 2, 6, 4, 9);
print_r(al_merge_sort( $arr ));
|
//3、二分查找-递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//二分查找-递归
function bin_search( $array , $low , $high , $k ){
if ( $low <= $high ){
$mid = intval (( $low + $high )/2);
} else {
return false;
}
if ( $array [ $mid ] == $k ){
return $mid ;
} elseif ( $k < $array [ $mid ]){
return bin_search( $array , $low , $mid -1, $k );
} else {
return bin_search( $array , $mid +1, $high , $k );
}
}
$arr = array (12, 5, 4, 7, 3, 8, 4, 2, 6, 4, 9);
$index = bin_search( $arr ,0,10,12); //直接输出为空,不解
echo ( intval ( $index ));
|
//4、二分查找-非递归
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function bin_search( $arr , $low , $high , $value ) { //$arr 数组; $slow 最小索引; $high 最大索引 $value 查找的值
while ( $low <= $high ) {
$mid = intval (( $low + $high )/2);
if ( $value == $arr [ $mid ]){
return $mid ;
} elseif ( $value < $arr [ $mid ]){
$high = $mid -1;
} else {
$low = $mid +1;
}
}
return false;
}
|
//5、快速排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
function quick_sort( $arr ) {
$n = count ( $arr );
if ( $n <=1)
return $arr ;
$key = $arr [0];
$left_arr = array ();
$right_arr = array ();
for ( $i =1; $i < $n ; $i ++) {
if ( $arr [ $i ]<= $key )
$left_arr []= $arr [ $i ];
else
$right_arr []= $arr [ $i ];
}
$left_arr =quick_sort( $left_arr );
$right_arr =quick_sort( $right_arr );
return array_merge ( $left_arr , array ( $key ), $right_arr );
}
|
//6、选择排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
function select_sort( $arr ) {
$n = count ( $arr );
for ( $i =0; $i < $n ; $i ++) {
$k = $i ;
for ( $j = $i +1; $j < $n ; $j ++) {
if ( $arr [ $j ]< $arr [ $k ])
$k = $j ;
}
if ( $k != $i ) {
$temp = $arr [ $i ];
$arr [ $i ]= $arr [ $k ];
$arr [ $k ]= $temp ;
}
}
return $arr ;
}
|
//7、插入排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function insertSort( $arr ) {
$n = count ( $arr );
for ( $i =1; $i < $n ; $i ++) {
$tmp = $arr [ $i ];
$j = $i -1;
while ( $arr [ $j ]> $tmp ) {
$arr [ $j +1]= $arr [ $j ];
$arr [ $j ]= $tmp ;
$j --;
if ( $j <0)
break ;
}
}
return $arr ;
}
|