冒泡排序:
特点:
<?php
$arr1=array(5,15,3,4,9,11);
$len=count($arr1);
echo "
排序之前:";
print_r($arr1);
//需要循环n-1趟
for($i=0;$i<$len-1;++$i){//设定比较的趟数
//每一趟的比较都比前一趟少一次,第一趟需要比较n-1次
for($k=0;$k<$len-1-$i;++$k){//设置本趟比较的次数
//这里要实现下标$k和下标$k+1这两项的比较:
if($arr1[$k]>$arr1[$k+1]){
$temp=$arr1[$k+1];
$arr1[$k+1]=$arr1[$k];
$arr1[$k]=$temp;
}
}
}
echo "
排序之后:";
print_r($arr1);
选择排序:
<?php
$arr1=array(5,15,3,4,9,11);
$len=count($arr1);
echo "
排序之前:";
print_r($arr1);
//要进行找出最大值的所在项的趟数
//需要循环n-1趟
for($i=0;$i<$len-1;++$i){
$max=$arr1[0];//取得第一项,并当作存储最大值的变量
$maxPos=0;//取得第一项的下标
for($k=1;$k<$len-$i;++$k){
//这里开始对从0到$len-$i的元素进行"找最大值及下标"
if($arr1[$k]>$max){
$max=$arr1[$k];
$maxPos=$k;
}
}
//开始做交换
$temp=$arr1[$maxPos];
$arr1[$maxPos]=$arr1[$len-1-$i];
$arr1[$len-1-$i]=$temp;
}
echo "
排序之后:";
print_r($arr1);
顺序查找:
<?php
header('Content-Type:text/html;charset=utf8');
//顺序查找
//需求:1.判断要找的数在数组中是否存在;2.找出要找数在数组中的下标
class OrderSearch{
/**
* 判断
*
* @param arr:数组
* @param n:需要查找的数
*
* @return bool
*/
public function isExist($arr,$n){
if(in_array($n, $arr)){
return true;
}
return false;
//可以使用三目
//in_array($n, $arr)==='true'?return true:return false;
}
/**
* 找出下标
*
* @param arr:数组
* @param n:需要查找的数
*
* @return bool
*/
public function getSub($arr,$n){
foreach ($arr as $key => $value) {
if($value==$n){
return $key;
}
}
}
}
$arr=array(5,15,3,4,9,11);
$n=4;
$os=new OrderSearch();
$bool=$os->isExist($arr,$n);
if($bool){
//$n在数组$arr中存在
echo "元素{$n}在数组arr中的下标为:".$os->getSub($arr,$n);
}else{
//$n在数组$arr中不存在
echo "元素{$n}在数组arr中不存在";
}
二分查找:
<?php
header('Content-Type:text/html;charset=utf8');
//二分查找
//有2个前提:1.数组已经排好序;2.是连续的索引数组,即下标为0,1,2,3,4,5...
class Search{
/**
*
* @param arr:已经排好序,而是连续的索引的数组
* @param n:查找的数
* @param statr:从start位开始查找
* @param end:查找到end位结束
*
* @return 1.查找数在数组中的位置 2.false
*/
public function twoPointsSearch($arr,$n,$start,$end){
//如果参数$start>$end,直接返回false
if($start>$end){
return false;
}
$mid=floor(($start+$end)/2);//返回$start和$end的中间值,如果有小数,舍去小数保留整数
if($arr[$mid]=$n){
return $mid;
}else if ($arr[$mid]>$n) {
//如果中间值大于需要查找的值
$end=$mid-1;
return self::twoPointsSearch($arr,$n,$start,$end);
}else{
//如果中间值小于需要查找的值
$start=$mid+1;
return self::twoPointsSearch($arr,$n,$start,$end);
}
}
}
$arr = array(3,4,5,15,19,21,25,28,30,30,33,38,44,51,52,55,60,77,80,82,83);
$n =33;
$len=count($arr);//count():计算数组长度
$search=new Search();
$result=$search->twoPointsSearch($arr,$n,0,$len-1);
if ($result===false) {
echo "没有找到";
}else{
echo "{$n}在数组arr中的位置为:".$result;
}