PHP 数组排序(冒泡排序、选择排序);数组查找(顺序查找、二分查找)

冒泡排序:

特点:


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

隐含的逻辑描述:
1.需要进行n-1趟的"冒泡"比较过程
2.每一趟的比较都前一趟少一次,第一趟的比较次数为n-1次
3.每趟比较,都是从数组的开头(0)开始,与后面紧跟着元素比较,并进行交换(比后一个元素大的时候才进行交换)

选择排序:


特点:


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

隐含的逻辑描述:
1.需要进行n-1趟的“选择”比较过程
2.每一趟要找的数据次数都比前一趟少一次,第一趟要找的次数为n次
3.每次找出的最大值所在的项,和要与之进行交换的项的位置,依次减1,第一次的位置为n-1


顺序查找:


<?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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章