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

2 篇文章 0 订阅
2 篇文章 0 订阅

冒泡排序:

特点:



    
    排序之前:";
	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)开始,与后面紧跟着元素比较,并进行交换(比后一个元素大的时候才进行交换)

选择排序:


特点:



     
     排序之前:";
	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


顺序查找:



    
     $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中不存在";
}

二分查找:



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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值