文档章节

数组的排序

穆子淼
 穆子淼
发布于 2014/09/26 14:18
字数 1985
阅读 22
收藏 0

u      数组的排序

 

这里我们介绍一些常用的排序方法, 排序是一个程序员基本功, 所谓排序就是对一组数据,按照某个顺序排列的过程。

 

排序分两大类:

l      内部排序

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

                                  

                            }

              }

              }

 

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

              print_r($myarr);

       }

 

 

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

      

 

       //使用函数去排序

       bubbleSort($arr);

      

       //输出

       print_r($arr);

 

 

?>

 

从上面的案例我们可以看出

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

    快速排序法

 

快速排序法,我们就介绍了一个思想:

    选择排序法

 

选择排序法的案例:

 

 

举例说明:

 

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;

 

              }

 

       }

自己分析流程.

 

    插入排序法

 

排序思想:

 

//插入排序法(->)

       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;      

              }

             

       }

从效率上看.

 

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

 

快速排序法.[空间和时间]

 

 

l      外边排序

 

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

 

 

 

u      查找

 

 

我们这里给大家介绍 两种

    顺序查找

对某个数组,安装顺序,一个一个比较,然后找到你要的数据.

案例:

 

要求从一个数组 $arr=array(46,90,900,0,-1)中查找一个 34,如果查找则输出该数的下标,如果找不到,则输出,查无此数

 

代码:

 

//要求从一个数组 $arr=array(46,90,900,0,-1)中查找一个 34,如果查找则输出该数//的下标,如果找不到,则输出,查无此数

 

       $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);

    二分查找法(必须掌握)

 

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

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

 

代码伺候:

//二分查找函数

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

              }

 

 

 

       }

 

u      多维数组-二维数组

二维数组的基本语法:

$arr=array( array(1,2,3), array(5,6,9) );

$arr[0]=array(1,0);

二维数组,地图 ...

 二维数组在内存中存在的形式:

快速入门案例:

 

请用二维数组,输出如下图形

 

0 0 0 0 0 0

    0 0 1 0 0 0  

    0 2 0 3 0 0

    0 0 0 0 0 0 

 

//定义一个二维数组

 

       $arr=array(

       array(0,0,0,0,0,0,1),

       array(0, 0, 1, 0 ,0 ,0,5),

       array(0 ,2 ,0, 3, 0, 0,90),

       array(0,0,0,0,0,0,100));

 

       //遍历二维数组()

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

             

              //遍历每行的数据

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

                     echo $arr[$i][$j]."&nbsp;";

              }

              echo "<br/>";

       }

 

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

 

 

1.  打印如下图型:

 

*********

*********

*********

*********

*********

*********

 

 

2.  打印如下图型:

 

*

**

***

****

*****

 

3.  打印如下图型:

 

2.       空心金字塔

3.       空心菱形

 

 

定义一个函数

function printTest($n,$name){

 

      

}

 

view.php

 

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

</head>

 

<form action="homework01.php" method="post">

请输入层数:<input type="text" name="layer"/><br/>

请选择形状:

<select name="shape">

<option value="a">矩形</option>

<option value="b">半金字塔</option>

<option value="c">金字塔</option>

<option value="d">金字塔</option>

<option value="e">金字塔</option>

</select><br/>

<input type="submit" value="打印"/>

</form>

 

</html>

 

homework01.php

 

<?php

 

 

       //死去活来

    //$n表示层数

       $n=$_REQUEST['layer'];

       //"a"->表示矩形 "b"=>一半金子塔 "c"=>完整的金字塔

       $shape=$_REQUEST['shape'];

      

       $starNum=5;

 

 

       //swtich

       function printShape($n,$shape,$starNum=5){

             

              switch($shape){

                    

                     case "a":

                            for($i=1;$i<=$n;$i++){

                                   for($j=1;$j<=$starNum;$j++){

                                          echo "*";

                                   }

                                   //打完一层后,换行

                                   echo "<br/>";

                            }

                            break;

                     case "b":

                            for($i=1;$i<=$n;$i++){

                                  

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

                                          echo "*";

                                   }

                                   echo "<br/>";

                            }

                            break;

                     case "c":

                            break;

              }

       }

 

       //调用

 

       printShape($n,$shape);

?>

 

 

 

1.      已知手掌游戏机一台320元,mp3一台260元。

公司举行抽奖大会,公司有18人,一等奖游戏机,二等奖mp3

购入5台游戏机,13mp3

问总价为多少,公司实际平均给每人花费了多少钱。(4980276.6666

 

<?php

       

$gamerPrice=320;

 $mp3Price=260;

 

 $gamerNum=5;

 $mp3Num=13;

 

 $totalPrice=$gamerPrice*$gamerNum+ $mp3Price* $mp3Num;

 

 $avgPrice= $totalPrice/ 18;

 

?>

 

 

1.      跳水比赛,8个评委打分。运动员的成绩是8个成绩取掉一个最高分,去掉一个最低分,剩下的6个分数的平均分就是最后得分。使用一维数组实现打分功能。

解题:

<?php

       $arr=array(90,23,89,100,2,5,89,44);

 

       //这里有一个思路,如果只想知道最低分和最高分是多少,则可以排序.

 

       //找出给出最低分的裁判

 

       //该函数可以返回给出最低分的裁判的下标

       function findMin($arr){

 

              //假设第一个人就是给出最低分的裁判

              $minFen=$arr[0];

              $minIndex=0;

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

       //如果下面条件成立,说明$i 裁判给出的成绩更低

if($minFen>$arr[$i]){

      $minFe=$arr[$i];

      $minIndex=$i;

}

}

return    $minIndex;

}

 

?>

 

 

 

 

u      php面向对象编程

 

 

提出一个问题?

 

张老太养了两只猫猫:一只名字叫小白,今年3,白色。还有一只叫小花,今年100,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。

 

首先我们用现有的知识来完成这个案例:

<?php

 

       $cat1_name=”小白”;

       $cat1_age=3;

       $cat1_color=”白色”;

 

       $cat2_name=”小花”;

       $cat2_age=100;

       $cat2_color=”花色”;

 

 

?>

 

我们能不能把属于同一事物的 变量,统一管理?

 

解决之道->对象

 

快速体验案例:

<?php

 

 

class Cat{

 

       public $name;

    public $age;

    public $color;

 

}

 

//创建一只猫

 $cat1=new Cat();

 $cat1->name="小白";

 $cat1->age=3;

 $cat1->color="白色";

 $cat2=new Cat();

 $cat2->name="小花";

 $cat2->age=100;

 $cat2->color="颜色";

 

//如果我们找到一只猫,只要找到 $cat1, 那么该变量所有相关的属性都通通的找到

$findCatName="小花";

if($cat2->name==$findCatName){

       echo $cat2->name."||".$cat2->age."||".$cat2->color;

}

 

 

?>

 

 

我们这里说明一下类和对象的关系(细节后面逐步展开)

总结几句话:

    类是抽象的,代表一类事物

    对象是具体,是类的一个具体实例

    类是对象的模板, 对象是类的一个个体实例

© 著作权归作者所有

上一篇: php面向对象编程
下一篇: php 位运算和数组
穆子淼
粉丝 2
博文 17
码字总数 22519
作品 0
昌平
私信 提问
计数排序vs基数排序vs桶排序

从计数排序说起 计数排序是一种非基于元素比较的排序算法,而是将待排序数组元素转化为计数数组的索引值,从而间接使待排序数组具有顺序性。 计数排序的实现一般有两种形式:基于辅助数组和基...

超人汪小建
02/18
0
0
PHP array_multisort—对多个数组或多维数组进行排序

PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。 关联(string)键名保持不变,但数字键名会被重新索引。 输入数组被当成一个表的列并以行来...

长征6号
2017/02/05
0
0
PHP数组常用函数分类整理

一、数组操作的基本函数 数组的键名和值 array_values($arr); 获得数组的值 array_keys($arr); 获得数组的键名 array_flip($arr); 数组中的值与键名互换(如果有重复前面的会被后面的覆盖) ...

我心中有猛狗
2016/07/05
45
0
PHP 数组函数-数组排序

php数组排序函数 sort ( &$arr [,fruits] ) 对数组进行从低到高排序 ,并赋予新的键名 返回bool rsort ( &$arr [,fruits] ) 对数组进行逆向排序 并赋予新的键名 asort ( &$arr [,fruits] ) ...

xinson
2014/11/03
25
0
如何使用强大的PHP函数对数组进行排序

这些天找工作,所以就看起了php用户手册,数组是必须要了解的,所以就贴出来一起学习学习。 如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你...

Adam-Lee
2011/07/23
9.7K
2

没有更多内容

加载失败,请刷新页面

加载更多

前端面试题汇总

一. HTML常见的兼容性 1.HTML5 标签在低版本浏览器不兼容 解决办法:使用html5shiv库,引入下列语句 <!--[if lte IE 8]> <script src="https://cdn.bootcss.com/html5shiv/r29/html5.js"></sc......

蓝小驴
29分钟前
7
0
OSChina 周四乱弹 —— 我气的脸都黑了!

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐《Red Battle》- 高橋李依 / 豊崎愛生 《Red Battle》- 高橋李依 / 豊崎愛生 手机党少年们想听歌,请使劲儿戳(这里) @丶Lion ...

小小编辑
42分钟前
554
22
找OSG教程, B站就有

https://www.bilibili.com/video/av64849038?from=search&seid=11632913960900279653

洛克人杰洛
今天
5
0
学习记录(day07-Vue组件、自定义属性、自定义事件)

[TOC] 1.1.1什么是组件 一个vue文件就是一个组件 组件将html标签/css样式/对应JS打包成一个整体,也可以理解钻进一个具有样式和特效的自定义标签。 一、编写组件(提供方)<template> <di...

庭前云落
今天
5
0
使用Prometheus监控SpringBoot应用

通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用。(本文以SpringBoot 2.1.9.RELEASE 作为监控目标) 编码 添加依赖 使...

JAVA日知录
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部