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