PHP数组排序!

参考:
http://zh.wikipedia.org/wiki/冒泡排序
冒泡排序
目标:将下列数组进行正序(从小到大)排列出来
$arr2 = array( 5, 15, 3, 4, 9, 11);
一般性逻辑描述:
1,对该数组从第一个元素开始,从左到右,相邻的2个元素比较大小:如果左边的比右边的大,则将他们俩交换位置,结果:

array( 5,  15,  3,  4, 9, 11);(原始)
array( 5,  15,  3,  4, 9, 11);
 array( 5,  3, 15,  4, 9, 11);
array( 5,  3, 4,  15, 9, 11);
array( 5,  3, 4,  9, 15, 11);
array( 5,  3, 4,  9, 11, 15);
此时,才“走完一轮回”,继续下一轮:
array( 5,  3, 4,  9, 11, 15);(初始)
array( 3  5, 4,  9, 11, 15);
array( 3  4, 5  9, 11, 15);
array( 3  4, 5  9, 11, 15);
array( 3  4, 5  9, 11, 15);
继续下一轮:
array( 3  4, 5  9, 11, 15);
。。。。。。。。
PHP数组排序!_第1张图片
QQ截图20161008150457.png

隐含的逻辑描述(假设数组有n项):
1, 需要进行n-1趟的“冒泡”比较过程。
2, 每一趟的比较都前一趟少比一次,第一趟需要比较n-1次
3, 每趟比较,都是从数组的开头(0)开始,跟紧挨的元素比较,并进行交换(需要的时候)

//DEMO
$arr = array(5,20,3,4,9,10);
$len = count($arr);
////要进行找出最大值所在项的趟数,需要进行n-1次的冒泡比较  
for($i=0;$i<$len-1;$i++){//设定比较的次数
//每一次比前一次少一次,第一次要比较n-1
    for($j=0;$j<$len-1-$i;$j++){
    //这里要实现下标为$j和$j+1的比较
        if($arr[$j] >$arr[$j+1]){
            $a1 = $arr[$j];
            $a2 = $arr[$j+1]; 
            $arr[$j] =$a2;
            $arr[$j+1] = $a1;
        }
    }
}
print_R($arr);

 

选择排序
目标:将下列数组进行正序(从小到大)排列出来
$arr2 = array( 5, 15, 3, 4, 9, 11);
一般性逻辑描述:
第1趟:取得该数组中的最大值及其下标,然后跟该数组的最后一项“交换”(倒数第1项确定)
第2趟:取得该数组中除最后1项中的最大值及其下标,然后跟倒数第2项交换(倒数第2项确定)
第3趟:取得该数组中除最后2项中的最大值及其下标,然后跟倒数第3项交换(倒数第3项确定)
。。。。。。

PHP数组排序!_第2张图片
Paste_Image.png

隐含的逻辑描述(假设数组有n项):
1,要进行n-1趟才可能得出结论
2,每一趟要找的数据的个数都比前一趟少一个,第1趟要找n个
3,每次找出的最大值所在的项,和要与之进行交换的项的位置,依次减1,第一次的位置n-1
DEMO:

//DEMO
$arr = array( 5,  15,  3,  4, 9, 11);
$len = count($arr);
//要进行找出最大值所在项的趟数
for($i = 0; $i < $len-1; ++$i){ //设定比较的趟数

    $max_val = $arr[0]; //取得第一项,并以之当作存储最大值的变量
    $max_key = 0;       //取得第一项的下标,并当作存储最大值对应下标的变量
    for($k = 0; $k < $len-$i; ++$k){
        //这里开始对从0到$len-$i这些元素进行“找最大值及其下标”
        if($arr[$k] > $max_val){
            $max_val = $arr[$k];    //存储最大值
            $max_key = $k;      //并同时存储对应下标
        }
    }
    //开始做交换(只有循环结束后,才可以确定最大值及其下标):
    $a1 = $arr[$max_key];
        $a2 = $arr[$len-1-$i];   
    $arr[$max_key] = $a2;//$len-1-$i就是“当前查找数据的最后一个位置”
    $arr[$len-1-$i] = $a1;
}
print_r($arr);
//DEMO
//二分查找思想:
//目标:找一个数据(31)在该数组中的位置
$v1 = 15;
$arr2 = array( 3,  4,  5,  15,  19, 21,  25,  30,  30,  30,  33,  38,  44, 51, 52, 55, 60,  77, 80, 82,  83);
//$arr: 要从中找数据的数组
//$v: 要找的数据
//$start: 要从该数组中查找的开始位置
//$start: 要从该数组中查找的结尾位置
function  binary_search($arr,  $v, $start, $end){
    if($start > $end)return false;
    $mid = floor(($start + $end)/2);    //计算出中间项的位置
    if($v == $arr[$mid]){
        return $mid;    //千恩万谢,第一次就找到了
    }
    else if($v < $arr[$mid]){   //此时就只要去“左边那一半”找了
        $start = $start;    //左边位置还是左边位置
        $end = $mid - 1;    //右边位置就应该是$mid - 1;
        //if($start > $end)return false;
        return binary_search($arr,  $v, $start, $end);
    }
    else{
        $start = $mid + 1;  //左边位置就应该是$mid + 1
        $end = $end;        //右边位置还是右边位置;
        //if($start > $end)return false;
        return binary_search($arr,  $v, $start, $end);
    }
}
$len = count($arr2);
$result = binary_search($arr2, $v1, 0, $len-1);
if($result === false){
    echo "没找到";
}
else{
    echo "位置为:$result";
}
//-------------------- 
// 基本数据结构算法
//--------------------

//二分查找(数组里查找某个元素) 
function bin_sch($array, $low, $high, $k){  
    if ($low <= $high){  
        $mid = intval(($low+$high)/2);  
        if ($array[$mid] == $k){  
            return $mid;  
        }elseif ($k < $array[$mid]){  
            return bin_sch($array, $low, $mid-1, $k);  
        }else{  
            return bin_sch($array, $mid+1, $high, $k);  
        }  
    }  
    return -1;  
} 

//顺序查找(数组里查找某个元素) 
function seq_sch($array, $n, $k){  
    $array[$n] = $k;  
    for($i=0; $i<$n; $i++){  
        if($array[$i]==$k){  
            break;  
        }  
    }  
    if ($i<$n){  
        return $i;  
    }else{  
        return -1;  
    }  
} 

//线性表的删除(数组中实现) 
function delete_array_element($array, $i) 
{ 
        $len = count($array);  
        for ($j=$i; $j<$len; $j++){ 
                $array[$j] = $array[$j+1]; 
        } 
        array_pop($array); 
        return $array; 
}

//冒泡排序(数组排序) 
function bubble_sort($array) 
{ 
        $count = count($array); 
        if ($count <= 0) return false;

        for($i=0; $i<$count; $i++){ 
                for($j=$count-1; $j>$i; $j--){ 
                        if ($array[$j] < $array[$j-1]){ 
                                $tmp = $array[$j]; 
                                $array[$j] = $array[$j-1]; 
                                $array[$j-1] = $tmp; 
                        } 
                } 
        } 
        return $array; 
}

//快速排序(数组排序) 
function quick_sort($array) { 
        if (count($array) <= 1) return $array;

        $key = $array[0]; 
        $left_arr = array(); 
        $right_arr = array();

        for ($i=1; $i

demo:



 $test=array(221,332,666,844,222,711);
 
 //数组排序正向
  function BubbleSort(&$arr){   
    $flag=1;
    for($i=0;$i$arr[$j+1]){
                $tmp=$arr[$j];
                $arr[$j]=$arr[$j+1];
                $arr[$j+1]=$tmp;
                $flag=1;
            }
        }   
    }
 }

 BubbleSort($test);
print_r($test);
 
//冒泡排序
function maopao($arr) {
    $count = count($arr);
    for($i=0; $i<$count-1; ++$i) {
        for($j=0; $j<$count-$i-1; ++$j) {
            if($arr[$j] > $arr[$j+1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}  
//冒泡排序(数组排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;

for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j–){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
 

 
 
//顺序排序
function shunxu($arr) {
    $count = count($arr);
    for($i=0; $i<$count-1; ++$i) {
        $p = $i;
        for($j=$i+1; $j<$count; ++$j) {
            $p = $arr[$p] > $arr[$j] ? $j : $p;
        }
        if($p != $i) {
            $tvalue = $arr[$i];
            $arr[$i] = $arr[$p];
            $arr[$p] = $tvalue;
        }
    }
    return $arr;
} 




//array_slice(array,start,length,true);//true - 保留键名;false默认。重置键名
 $arr = array(
 array(1,2,3,4,5,6),
 array(11,2,3,4,5,6),
 array(1,22,3,4,5,6),
 array(1,2,33,4,5,6),
 array(1,2,3,44,5,6),
 array(1,2,3,4,55,6),
 array(1,2,3,4,5,66),
 
 
 );


$n = array_slice($arr,0,2,true);
echo"
";print_R($n);
 



你可能感兴趣的:(PHP数组排序!)