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




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