<?php

$arr=array(5,2,1,7,8,6,3,10,9);

showArray($arr);

/**

 * 遍历打印数组

 * @param string $type  排序方式

 * @param array $arr    排序数组

 */

function showArray($arr,$type='原数组'){

    echo "$type:<br/>";

    foreach ($arr as $v){

        echo ' '.$v.' ';

    }

    echo '<br/>';

}



/**

 * 冒泡排序

 * 从小到大,大边界逐渐下降

 * @param array $arr

 */

function bubbleSort($arr){

    for($i=0;$i<count($arr)-1;$i++){

        for ($j = 0; $j < count($arr)-1-$i; $j++) {

            if($arr[$j]>$arr[$j+1]){

                $temp=$arr[$j+1];

                $arr[$j+1]=$arr[$j];

                $arr[$j]=$temp;

            }

        }

    }

    return $arr;

}

// showArray(bubbleSort($arr),'冒泡排序');


/**

 * 选择排序

 * 找出最小值,小边界逐渐向大收缩

 * @param array $arr

 */

function selectSort($arr){

    for ($i = 0; $i < count($arr); $i++) {

        $minVal=$arr[$i];

        $minIndex=$i;

        for ($j = 0+1+$i; $j < count($arr); $j++) { //自己不用比 +1  小边界逐渐收缩 +$i

            if ($minVal>$arr[$j]){  //找出最小值,为了比对最后一位

                $minVal=$arr[$j];

                $minIndex=$j;

            }

        }

        $temp=$arr[$i];

        $arr[$i]=$minVal;

        $arr[$minIndex]=$temp;

    }

    return $arr;

}

// showArray(selectSort($arr),'选择排序');


/**

 * 插入排序

 * 没有边界控制,利用minI向左偏移对比,达成就数组右移空位,插入

 * @param array $arr

 */

function insertSort($arr){

    for ($i = 1; $i < count($arr); $i++) {  //从1开始,向-1位对比

        $minV=$arr[$i];

        $minI=$i-1;

        while ($minI>=0 && $minV<$arr[$minI]) {  //向左对比,达成就右移空出$minV位置

            $arr[$minI+1]=$arr[$minI];

            $minI--;

        }

        $arr[$minI+1]=$minV;

    }

    return $arr;

}

// showArray(insertSort($arr),'插入排序');

/**

 * 快速排序

 * @param unknown $arr

 * @return unknown|multitype:

 */

function quickSort($arr){

    if(count($arr)<=1) return $arr;

    $flag=$arr[0];

    $left=array();

    $right=array();

    for ($i = 1; $i < count($arr); $i++) {

        if($arr[$i]>$flag){

            $left[]=$arr[$i];

        }else {

            $right[]=$arr[$i];

        }

    }//分完大小一次,再分

    $left=quickSort($left);

    $right=quickSort($right);

    

    return array_merge($right,array($flag),$left);

}

// showArray(quickSort($arr),'快速排序');


/**

 * 二分法查找

 * @param unknown $a

 * @param unknown $val

 * @return number

 */

function binarySearch($a, $val) {

    $low = 0;

    $high = count ( $a ) - 1;

    while ( $low <= $high ) {

        $mid = intval ( ($low + $high) / 2 );

        if ($a [$mid] == $val)

            return $mid;

        if ($a [$mid] > $val) {

            $high = $mid - 1;

        } else {

            $low = $mid + 1;

        }

    }

    return - 1;

}  

$a=quickSort($arr);

echo binarySearch($a, 7);

/**

 *顺序查找

 */

function search(&$arr,$findVal){

    $flag=false;

    for($i=0;$i<count($arr);$i++){

        if($findVal==$arr[$i]){

            echo "找到了,下标为=$i";

            $flag=true;

            //break;

        }

    }

    if(!$flag){

        echo '查询不到';

    }

}

search($arr,-1);