冒泡排序&选择排序&二分查找&快速排序

冒泡排序

$arr = [-1, 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48, 1, 6, 8, 11, 23];

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

echo "<pre>";
print_r(test($arr));
echo "</pre>";

选择排序

$arr = [-1, 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48, 1, 6, 8, 11, 23];

function test ($arr) {
	for ($i=0; $i < count($arr)-1; $i++) { 
		$pos = $i;
		for ($j=$i+1; $j < count($arr); $j++) { 
			if ($arr[$pos] > $arr[$j]) {
				$pos = $j;
			}
		}
		if ($pos != $i) {
			$temps = $arr[$i];
            $arr[$i] = $arr[$pos];
            $arr[$pos] = $temps;
		}
	}
	return $arr;
}

echo "<pre>";
print_r(test($arr));
echo "</pre>";

二分查找

function test ($arr, $min, $max, $k, $i=0) {
    $middle = intval(($min+$max)/2);
    if ($min > $max) {
    	return -1;
    }
    if ($k > $arr[$middle]) {
    	return test($arr, $middle+1, $max, $k, $i);
    } elseif ($k < $arr[$middle]) {
    	return test($arr, $min, $middle-1, $k, $i);
    } elseif ($k == $arr[$middle]) {
    	return $middle;
    }
}
$arr = array(1,2,3,4,5,6,7,8,27,36);
$min = 0;
$max = count($arr)-1;

echo test($arr, $min, $max, 7);

快速排序

$arr = array(25,133,452,364,5876,293,607,365,8745,534,18,33);
function test($arr)
{
    // 判断是否需要继续
    if (count($arr) <= 1) {
        return $arr;
    }
    $middle = $arr[0]; // 中间值
    $left = array(); // 小于中间值
    $right = array();// 大于中间值
    // 循环比较
    for ($i=1; $i < count($arr); $i++) { 
        if ($middle < $arr[$i]) {
            // 大于中间值
            $right[] = $arr[$i];
        } else {
            // 小于中间值
            $left[] = $arr[$i];
        }
    }
    // 递归排序两边
    $left = test($left);
    $right = test($right);
    // 合并排序后的数据,别忘了合并中间值
    return array_merge($left, array($middle), $right);
}

echo "<pre>";
print_r(test($arr));
echo "</pre>";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值