php基础——数组排序与查找

PHP冒泡排序

冒泡排序的思路?

  • 首先就是先比较相邻的两个元素,如果满足条件,就交换,否则不动。
  • 然后是再比较接下来的两个相邻的元素,然后满足条件就交换,否则依然不动。
  • 依次循环操作下去,最终一个元素,会固定在最下边

代码示例

// 冒泡排序
function bubble_sort(&$arr) {
    $len = count($arr);
    // 循环对比的轮数
    for ($i = 0; $i < $len -1; $i++) {
        //当前轮相邻元素循环对比
        for ($j = 0; $j < $len - $i - 1; $j++) {
            // 如果前边的大于后边的 交换数据
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
        }
    }
}

$arr = [5,2,4,7,9,4,2,6,8,3];
var_dump($arr);

错误代码示例
我写的,也可以排序,但不符合冒泡的概念

$arr = array(6, 1, 4, 0);

for ($i=0; $i<count($arr)-1; $i++){
    for ($j=$i+1; $j<count($arr); $j++){
        if ($arr[$i] > $arr[$j]){
            $num = $arr[$i];
            $arr[$i] = $arr[$j];
            $arr[$j] = $num;
        }
    }
}


var_dump($arr);

冒泡排序的优化

待优化的例子

// 这个数组使用冒泡排序,只需要一轮排序就可以完成,但如果按照上面代码仍会进行4轮排序
// 思路: 只有第1轮会进if判断,后3轮不进if判断
$arr = array(1, 3, 5, 8, 7);

优化案例

// 冒泡排序
function bubble_sort(&$arr) {
	// 设置一个标志位
    $flag = 0;
    $len = count($arr);
    // 循环对比的轮数
    for ($i = 0; $i < $len -1; $i++) {
        //当前轮相邻元素循环对比
        for ($j = 0; $j < $len - $i - 1; $j++) {
            // 如果前边的大于后边的 交换数据
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
                // 设置flag = 1
                $flag = 1;
            }
        }
        // 给个判断 如果flag==0  说明没有进入if,即没有进行一次交换,此时数组已经是顺序排序,结束循环
        if ($flag == 0){
            break;
        }else{
            // 重置flag
            $flag = 0;
        }
    }
}

$arr = range(1,1000);
bubble_sort($arr);
var_dump($arr);

选择排序

选择排序也属于内部排序法,是从数组中,按指定规则选出某一元素,经过和其他元素比较,按规则交换位置后,达到排序的目的

选择排序的思路?

  • 第一次从R[0]~R[n-1] 中选择最小值,与[R0]交换
  • 第二次从R[1]~R[n-1] 中选择最小值,与[R1]交换
  • 第三次从R[2]~R[n-1] 中选择最小值,与[R2]交换
  • 第 i 次从R[2]~R[n-1] 中选择最小值,与[R2]交换

插入排序

快速排序

顺序查找

在数组中查找某个值,若有返回下标,若无提示 “查询不到”

function search(&$arr, $v){
    foreach ($arr as $key=>$value){
        if ($value === $v){
            return $key;
        }
    }
    // 如果找到了 代码就走不到这里 上面的return会结束函数
    return '找不到';
}

$v = 'hello';
$arr = array(6, 1, 4, 0, 'hello');
echo search($arr, $v);

上面代码只要找到1个就会结束查找,如何找到多个呢?

function search(&$arr, $find_val){
    // 添加一个标志位
    $flag = 0;
    foreach ($arr as $key=>$value){
        if ($value === $find_val){
            echo $key,'<br>';
            $flag = 1;
        }
    }

    // 判断 找到了flag=1 找不到flag=0
    if ($flag == 0){
        echo '找不到';
    }

}

$find_val= 'hello';
$arr = array(6, 1, 4, 0, 'hello', 'hello');
search($arr, $find_val);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值