排序方式和查找

<?php

// 冒泡排序-----越比越少
// 拿出数组中相邻的两个元素进行对比,如果下标大的值比下标小的值小,把位置调换
$arr = array(5,3,8,4,9,1,6,0,7,2);

print_r(bubble_sort($arr));

function bubble_sort($array)
{
    $count = count($array);
    // print_r($count);
    if ($count <= 0) {
        return false;
    }
    for ($i=0; $i <$count ; $i++) {
        for ($j=$count-1; $j >$i ; $j--) {
            if ($array[$j] < $array[$j-1]) {
                $x = $array[$j];
                $array[$j] = $array[$j-1];
                $array[$j-1] = $x;
            }
        }
    }
    return $array;
}

// ...........................................................................

// 冒泡排序

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

    $count = count($arr);
    // print_r($count);
    if ($count <= 0) {
        return false;
    }
    for ($i=0; $i <$count ; $i++) {
        for ($j=$count-1; $j >$i ; $j--) {
            if ($arr[$j] < $arr[$j-1]) {
                $x = $arr[$j];
                $arr[$j] = $arr[$j-1];
                $arr[$j-1] = $x;
            }
        }
    }
    print_r($arr);

// ....................................................................................

// 快速排序

function kuaisu($arr){
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for($i=1; $i<$len;$i++){
        if($arr[$i] <= $key){
            $left_arr[] = $arr[$i];
        }else{
            $right_arr[] = $arr[$i];
        }
    }
    $left_arr = kuaisu($left_arr);
    $right_arr = kuaisu($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}
$arr = array(23,98,54,2,9,62,34);
print_r(kuaisu($arr));

// .............................................................................

// 快速排序
// 取出下表为0的一个元素定义为$key,用这个元素和其他元素进行比较,被比的元素比$key小,就放到左边的数组,否则就放到右边的数组,把三个数组进行合并
// $arr = array(23,98,54,2,9,62,34);

$len = count($arr);
    if($len <= 1){
        return $arr;
    }
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for($i=1; $i<$len;$i++){
        if($arr[$i] < $key){
            $left_arr[] = $arr[$i];
        }else{
            $right_arr[] = $arr[$i];
        }
    }
    // $left_arr = kuaisu($left_arr);
    // $right_arr = kuaisu($right_arr);
    $b = array_merge($left_arr, array($key), $right_arr);
    print_r($b);die;

// .........................................................................

// 插入排序---直接插入------越比越多
先定义一个值,那这个值和其他的进行比较,如果定义的值是最小的,则不变,反之,
function insertSort($arr) {
     $len=count($arr);
     for ($i=1; $i < $len; $i++) {
         //获得当前需要比较的元素值。
         $tmp = $arr[$i];
         //内层循环控制 比较 并 插入
         for ($j = $i - 1; $j >= 0; $j--) {
             //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
             if ($tmp < $arr[$j]) {
                 //发现插入的元素要小,交换位置
                 //将后边的元素与前面的元素互换
                 $arr[$j + 1] = $arr[$j];
                 //将前面的数设置为 当前需要交换的数
                 $arr[$j] = $tmp;
             } else {
                 //如果碰到不需要移动的元素
                 //由于是已经排序好是数组,则前面的就不需要再次比较了。
                 break;
             }
         }
     }
     //将这个元素 插入到已经排序好的序列内。
     //返回
     return $arr;
}
$arr = array(88, 1, 2, 5, 4, 3, 66, 0);
$res = insertSort($arr);
print_r($res);

// ........................................................................
// 折半查找
// 定义一个要查找的值、最大值的下标和最小值的下标,获得平均下标,拿平均下标的值和要找的值进行比对,如果要找的值小,则对左边的一部分进行再次查找,最大值变成平均值-1,反之,
$arr = array(1,5,6,7,8,9);

function zheban($arr,$num)
{
    $low = 0;
    $top = sizeof($arr)-1;
    while ($low <= $top) {
        $zhong = floor(($low+$top)/2);
        if ($arr[$zhong] == $num) {
            return $zhong;
        }elseif ($arr[$zhong] < $num) {
            $low = $zhong+1;
        }else{
            $top = $zhong-1;
        }
    }
    return "1";
}

print_r(zheban($arr,8));

// .................................................................

/*
*堆、栈、队列
*/
// $arr = array(1,5,6,7,8,9);

// //先进先出
// // $b = array_shift($arr);
// // print_r($b);
// // print_r($arr);

// //插入一条数据在后面
// array_push($arr, 10);
// // print_r($arr);

// //后进先出
// array_pop($arr);
// print_r($arr);

//................................................................................

// 1        1         1        1       1        1          1        1

// 128     64        32        16      8        4          2        1


// 01101011
// //转十进制
// 1+2+0+8+0+32+64+0=107

// 302
// //十进制转二进制
// 100101110

// 1+2+4+16+128
?>

posted @ 2017-06-23 20:38  鹏哥哥blog  阅读(54)  评论(0)    收藏  举报