陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找

来源:互联网 发布:国家广电网络宽带 编辑:程序博客网 时间:2024/04/29 02:16

陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找

  PHP程序设计语言中的排序有内部排序、外部排序法等多种。本文介绍了交换式排序法、选择式排序法、插入式排序法等。还介绍了顺序查找、二分查找法等内容。

一、排序的介绍
    在贵阳网站建设中,我们介绍一些常用的排序方法,排序是一个程序员基本功,所谓排序就是对一组数据,按照某个顺序排列的过程。
排序是将一组数据,依指定的顺序进行排列的过程。排序的分类分为内部排序和外部排序等。
    ①内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法(冒泡法、快速排序法)、选择式排序法和插入式排序法);
    ②外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
    排序(Sorting)是数据处理中一种很重要的运算,同时也是很常用的运算,一般数据处理工作25%的时间都在进行排序。简单地说,排序就是把一组记录(元素)按照某个域的值的递增(即由小到大)或递减(即由大到小)的次序重新排列的过程。
    排序分内部排序、外部排序两大类。内部排序法分为:交换式排序法(冒泡法、快速排序法)、选择式排序法和插入式排序法三种。
交换式排序法:交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。 交换式排序法又可分为两种:冒泡排序法(Bubble sort)、快速排序法 (Quick sort)。

二、交换式排序法(冒泡法)
    冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。 
    因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

软件设计,PHP排序和查找

案例说明:
<?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;
    }
     }
  }
  echo "<br/>函数中的myarr数组";
  print_r($myarr);
 }
 $arr=array(0,5,-1); //使用函数去排序
 bubbleSort($arr);
 print_r($arr); //输出结果
?>
     贵阳网站建设的朋友请注意:从上面的案例我们可以看出:数组默认传递的是值,不是地址。因此在本例中,要实现函数外面的数组也要排序,则需要传递数组的地址才行。

三、交换式排序法(快速排序法)
     快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
//****快速排序法******
<?php 
date_default_timezone_set('Asia/Shanghai');
$today = date('Y-n-d G:i:s');
echo $today;
$array=array(-9,78,0,23,-567,89);
function quickSort($left,$right,&$array){
  $l=$left;
  $r=$right;
  $pivot = $array[($left+$right)/2];
  $temp=0;
  while($l<$r){
   while($array[$l]<$pivot) $l++;
   while($array[$r]>$pivot) $r--;
   if($l>=$r) break;
   $temp=$array[$l];
   $array[$l]=$array[$r];
   $array[$r]=$temp;
   if($array[$l]==$pivot) --$r;
   if($array[$r]==$pivot) ++$l;
  }
  if($l==$r){
    $l++;
    $r--;
  }
  if($left<$r)  quickSort($left,$r,$array);
  if($right>$l) quickSort($l,$right,$array);
  }
quickSort(0,count($array)-1,$array);
print_r($array);
?>

四、选择式排序法(选择排序法)
    选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
    选择式排序又可分为两种:
    1.选择排序法(Selection Sort)
    2.堆排序法(Heap Sort)
    选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,…,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…, 第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。例如,给定n=8,数组R中的8个元素的排序码为:(8,3,2,1,7,
4,6,5),
    选择排序法的案例:

软件设计,PHP排序和查找

举例说明:
function selectSort(&$arr){
  $temp=0;
  for($i=0;$i<count($arr)-1;$i++){
   $minVal=$arr[$i]; //假设 $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;
  }
}

<?php
$arr = array(34,9,90,2,3,1,-12);
echo "排序前<br/>";
print_r($arr);
 //选择排序法,【特别说明数组传递是值传递,不是地址传递(不是引用传递)】
 //如果要影响到函数外边的$arr,则需要 function selectSort(&$arr) 才可以。
 //调用时候,是 selectSort($arr)即可,即和普通的调用方法没有什么不一样。
 function selectSort($arr){
  echo "<br/>select sort 被调用<br/>";
  for($i=0;$i<count($arr)-1;$i++){
   //假设当前$i对应的值是最小的
   $min=$arr[$i];
   $minIndex=$i;
   for($j=$i+1;$j<count($arr);$j++){
    if($min>$arr[$j]){ //如果假设的最小值,不是最小则
     $min=$arr[$j];
     $minIndex=$j; //同时修改$minIndex
    }
   }
   //此时本次轮询的最小值和下标已找到,可以交换。
   if($minIndex!=$i){ //如果相等,则无需交换
    $temp=$arr[$i];
    $arr[$i]=$arr[$minIndex];
    $arr[$minIndex]=$temp;
   }
  }
  echo "<br/>在selectsort函数内排序后<br/>";
  //这里打印出排序后的顺序
  print_r($arr);
 }
 selectSort($arr); //测试数据
 echo "<br/>排序后<br/>";
 print_r($arr);
?>

五、插入式排序法(插入排序法)
    插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
    例如n=6,数组R的六个排序码分别为:17,3,25,14,20,9。它的直接插入排序的执行过程如图所示。
    举例说明插入法。
    我们将五个无序:3,68,-1,0,100 使用插入排序法将其排成一个从小到大的有序数列。
//插入排序法(小->大)
<?php 
$arr = array(34,9,90,2,3,1,-12);
echo "排序前<br/>";
print_r($arr);
 function insertSort(&$arr){
 for($i=1;$i<count($arr);$i++){
   $insertVal=$arr[$i];
   $index=$i-1;
   while($index>=0&&$arr[$index]>$insertVal){
    $arr[$index+1]=$arr[$index];
    $index--;
   }
   $arr[$index+1]=$insertVal;
  }
 }
 insertSort($arr);
 echo "<br/>排序后<br/>";
 print_r($arr);
?>
整理函数:
 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(46,90,900,0,-1)中查找一个数34,如果查找则输出该数的下标,如果找不到,则输出“查无此数”。
PHP程序设计代码:
 $arr=array(46,90,900,0,-1,-1);
 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);

七、二分查找法
     所谓二分查找,它有一个重要的前提,该数组本身已经是一个有序数组。 
     如果该数组不是有序的,则必须先排序再查找。
     首先找到数组中间这个数,然后与要查找的数比较,如果要查询和数大于中间这个数,则说明应当向后查询,否则向前找,如果相等则说明找到。
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";
  }
 }

【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找

0 0
原创粉丝点击