数组的排序和查找

 

数组的排序

这里介绍一些常用的排序方法,排序是一个程序员的基本功

所谓排序就是对一组数据,按照某个顺序排列的过程

排序分2大类:

内部排序

交换式排序法

1 ,冒泡法

快速体验:

<?php

$arr = array (0, 5, - 1 );

//从小到大排

$temp = 0;

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];

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

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

       }

    }

}

print_r ( $arr );

?>

扩展:为了更好的使用排序,我们将其封装成一个函数

代码如下:

<?php

//现在我们把冒泡法封装成函数,利于以后使用。

function bubbleSort($myarr) {

    $temp = 0;

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

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

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

              $temp = $myarr [$j];

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

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

           }

       }

    }

}

 

$arr = array (0, 5, - 1 );

//从小到大排

//使用函数去排序

bubbleSort ( $arr );

print_r ( $arr );

?>

结果没有变化???

分析原因:

改进后:

<?php

//现在我们把冒泡法封装成函数,利于以后使用

function bubbleSort(&$myarr) {

    //加了个地址符&

    $temp = 0;

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

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

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

              $temp = $myarr [$j];

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

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

           }

       }

    }

    echo "<br/>函数中的myarr数组";

    print_r ( $myarr );

}

$arr = array (0, 5, - 1 );

//从小到大排

//使用函数去排序

bubbleSort ( $arr );

print_r ( $arr );

?>

☞☞小结论:

数组默认传递的是值,不是地址

2,选择排序法

案例:

<?php

function selectSort(&$arr){

    $temp = 0;

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

       //假设$i是最小的数

       $minVal = $arr [$i];

       //记录我认为的最小数的下标

       $minIndex = $i;

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

           //说明我们认为的最小值,不是最小

           if ($minVal > $arr [$j]) {

              $minVal = $arr [$j];

              $minIndex = $j;

           }

       }

       //最后交换

       $temp = $arr [$i];

       $arr [$i] = $arr [$minIndex];

       $arr [$minIndex] = $temp;

    }

}

$arr = array (0, 5, - 1 );

//从小到大排

//使用函数去排序

selectSort ( $arr );

print_r ( $arr );

?>

3,插入排序法

<?php

//小到大排

function insertSort(&$arr){

    //先默认下标为0,这个数已经是有序的了

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

       //$insertVal是准备插入的数

       $insertVal = $arr [$i];

       //准备先和下标为$insertIndex的数比较

       $insertIndex = $i - 1;

       //如果这个条件满足,说明,我们还没有找到适当的位置。

       while ( $insertIndex >= 0 && $insertVal < $arr [$insertIndex] ){

           //同时把数后移

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

           $insertIndex --;

       } //插入(这是就给$insertVal找到位置了)

      

       $arr [$insertIndex + 1] = $insertVal;

    }

}

$arr = array (0, 5, - 1 );

insertSort ( $arr );

print_r ( $arr );

?>

4,快速排序法(php程序员不做要求)

从效率上看,(效率 时间和空间上看)

冒泡法<选择排序法<插入排序法

快速排序法【空间和时间协调】

现在更关心时间问题了,更接近于用空间来换取时间了

外部排序

因为数据量大,必须借助外部文件来完成

扩展:

1,工作2,3年后,可以研究:

基础得扎实(长远来看)

      

研究linux内核

研究算法

研究网络技术

研究数据库

高级的架构师是没有问题的

2,打出系统的当前时间

date_default_timezone_set('Asia/Shanghai');

$today= date('y-n-d G:i:s');

echo $today;

3,动态创建200000个数

<?php

//动态的创建200000个数据

$arr=array();

for($i=0;$i<20;$i++){

    $arr[$i]=rand(0,3000);

    //200000*4=800000

    echo $arr[$i]."<br/>";

    }

?>

4,优化冒泡排序

小小的优化,带来效率的提升

<?php

//现在我们把冒泡法封装成函数,利于以后使用

function bubbleSort(&$myarr) {

    $temp = 0;

    $flag = false; //默认没有进来

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

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

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

              $temp = $myarr [$j];

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

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

              $flag = true;

              //进来后,就为true了,

           }

       }

       //判断

       if (! $flag) {

           //已经是有序的

           break;

       }

       $flag = false;

    }

    echo "<br/>函数中的myarr数组";

    print_r ( $myarr );

}

$arr = array (0, 5, - 1 );

//从小到大排

//使用函数去排序

bubbleSort ( $arr );

print_r ( $arr );

?>

查找

介绍2

1,顺序查找

对某个数组,按照顺序,一个一个比较,然后找到你想要的数据

案例:

要求从一个数组中查找到一个数,如果找到,则输出该数的下标,若找不到,则输出,查无此数

<?php

function search(&$arr, $findVal) {

    $flag = false;

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

      

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

           echo "找到了,下标为$i<br/>";

           $flag = true;

           //break;

       }

    }

    if (! $flag) {

       echo '查询不到';

    }

}

$arr = array (2.2, 0, 4, 0 );

search ( $arr, 0 );

?>

2,二分查找(必须要掌握的)

所谓二分查找,它有一个重要的前提,该数组本身,已经是一个有序数组

如果该数组不是有序的,则必须先排序再查找

思想:

<?php

//二分查找

function binarySearch(&$arr, $findVal, $leftIndex, $rightIndex) {

    //

    //$rightIndex>$leftIndex,说明没有数

    if ($rightIndex < $leftIndex) {

       echo "找不到该数";

       return;

    }

    //找到中间这个数,

    $middleIndex = round ( ($rightIndex + $leftIndex) / 2 );

    //如果是大于,则向后面找。

    if ($findVal > $arr [$middleIndex]) {

       binarySearch ( $arr, $findVal, $middleIndex + 1, $rightIndex );

    } //如果是小于,则向前面找。

    else if ($findVal < $arr [$middleIndex]) {

       binarySearch ( $arr, $findVal, $leftIndex, $middleIndex - 1 );

    } else {

       echo "找到这个数,下标是$middleIndex";

    }

}

$arr = array (- 2, 0, 4, 5 );

binarySearch ( $arr, 5, 0, count ( $arr ) - 1 );

?>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值