冒泡排序:
特点:
排序之前:";
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;
}