数组的排序和查找

来源:互联网 发布:linux系统版本对比 编辑:程序博客网 时间:2024/05/01 21:22

 

数组的排序

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

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

排序分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

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

functionbubbleSort($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

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

functionbubbleSort(&$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

functionselectSort(&$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

//小到大排

functioninsertSort(&$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

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

functionbubbleSort(&$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

functionsearch(&$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

//二分查找

functionbinarySearch(&$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);

?>

 

原创粉丝点击