陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找
来源:互联网 发布:国家广电网络宽带 编辑:程序博客网 时间:2024/04/29 02:16
陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找
PHP程序设计语言中的排序有内部排序、外部排序法等多种。本文介绍了交换式排序法、选择式排序法、插入式排序法等。还介绍了顺序查找、二分查找法等内容。
一、排序的介绍
在贵阳网站建设中,我们介绍一些常用的排序方法,排序是一个程序员基本功,所谓排序就是对一组数据,按照某个顺序排列的过程。
排序是将一组数据,依指定的顺序进行排列的过程。排序的分类分为内部排序和外部排序等。
①内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法(冒泡法、快速排序法)、选择式排序法和插入式排序法);
②外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。
排序(Sorting)是数据处理中一种很重要的运算,同时也是很常用的运算,一般数据处理工作25%的时间都在进行排序。简单地说,排序就是把一组记录(元素)按照某个域的值的递增(即由小到大)或递减(即由大到小)的次序重新排列的过程。
排序分内部排序、外部排序两大类。内部排序法分为:交换式排序法(冒泡法、快速排序法)、选择式排序法和插入式排序法三种。
交换式排序法:交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。 交换式排序法又可分为两种:冒泡排序法(Bubble sort)、快速排序法 (Quick sort)。
二、交换式排序法(冒泡法)
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。
案例说明:
<?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),
选择排序法的案例:
举例说明:
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排序和查找
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第42讲:PHP数据库开发案例
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第26讲:PHP函数
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第27讲:PHP位运算
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第28讲:PHP数组
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第30讲:PHP多维数组
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第34讲:PHP 封装、继承、多态
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第38讲:PHP数据库编程mysql
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第44讲:PHP程序设计中的COOKIE
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第48讲:PHP绘图技术
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第50讲:PHP中的xml编程
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第41讲:PHP开发工具之zend studio介绍
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第49讲:PHP报表开发(JpGraph)
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第25讲:Break、Cintinue、Goto控制
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第37讲:HTTP协议请求(响应)
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第十六讲:PHP入门
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第21讲:PHP运行原理及编程规范
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第24讲:PHP程序的控制结构
- 自定义Windows右键菜单
- 利用Redis BitMap 统计用户活跃指标
- ip地址、子网掩码、DNS的关系与区别
- ajax返回数据的遍历方式
- 与善淘网一起做慈善商店
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第29讲:PHP排序和查找
- Lucene三(索引加权)
- java动态代理(JDK和cglib)
- redis内存泄露问题
- redis 学习指南
- 实现简单的MVC模式,通过一个小例子,不是很完美,但是可以说明一部分的问题
- 黑马程序员----反射技术
- windows下C的定时器timeSetEvent使用
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值