PHP四大基本算法个人总结

四大算法:冒泡,快排,选择,插入。

冒泡排序:相邻两个元素比较,知道达到目标效果为止。tips:个人理解,时间复杂度为,每排序一次,时间复杂度减少一次,因为最大的值必定在最后。

上代码:

<?php

function bubbleasc($arr){ //升序
	$sum = count($arr);
	for ($index = 0; $index < $sum - 1; $index++) { 
		for ($index2 = 0; $index2 < $sum - $index - 1; $index2++) { 
			if ($arr[$index2] > $arr[$index2 + 1]) {
				$temp = $arr[$index2];
				$arr[$index2] = $arr[$index2 + 1];
				$arr[$index2 + 1] = $temp;
			}
		}
	}
	return $arr; // 将处理完的数据返回,必须返回,否则返回为空。
}
function bubbledesc($arr){ // 降序
	$sum = count($arr);
	for ($i=0; $i < $sum - 1; $i++) { 
		for ($j=0; $j < $sum - $i - 1; $j++) { 
			if ($arr[$j] < $arr[$j + 1]) {
				$temp = $arr[$j];
				$arr[$j] = $arr[$j +1];
				$arr[$j+1] = $temp;
			}
		}
	}
	return $arr;
}
$arr = array(3,2,9,5,4,6,8,7,1,0);
var_dump(bubbledesc($arr));

分别写了升序和降序,所以最值永远出现在最后一个元素。

快排:中心是基准(pivot),分区(partition)和递归(recursive)。首先选择一个基准,其次创建连个空数组,命名为左数组和右数组,将原数组的所有元素和基准进行比较

上代码:

<?php
function asc($arr){ // 升序快排
	if (count($arr) <= 0) { //判定数组不为空
		return $arr;
	}
	if (count($arr) <= 1) { //数组元素个数为1,递归出口
		return $arr;
	}
	$left = $right = array();
	$pivot = $arr[0];
	for ($i=1; $i < count($arr); $i++) { 
		if ($arr[$i] < $pivot) {
			$left[] = $arr[$i];
		} else{
			$right[] = $arr[$i];
		}
	}
	$left = asc($left); //左分区递归
	$right = asc($right); //右分区快排
	return array_merge($left,array($arr[0]),$right);
}
function desc($arr){ // 升序快排
	if (count($arr) <= 0) { //判定数组不为空
		return $arr;
	}
	if (count($arr) <= 1) { //数组元素个数为1,递归出口
		return $arr;
	}
	$left = $right = array();
	$pivot = $arr[0];
	for ($i=1; $i < count($arr); $i++) { 
		if ($arr[$i] > $pivot) {
			$left[] = $arr[$i];
		} else{
			$right[] = $arr[$i];
		}
	}
	$left = desc($left); //左分区递归
	$right = desc($right); //右分区快排
	return array_merge($left,array($arr[0]),$right); //一定要把中间的值数组化,否则报错
}
$arr = array(3,2,9,5,4,6,8,7,1,0);
print_r(desc($arr));

---------------------------------------------------------------------正题分割线--------------------------------------------------------------------------------

ps:刚刚断网了,差点要重写,吓死···

---------------------------------------------------------------------正题分割线---------------------------------------------------------------------------------

选择排序:选择排序基本来说是我看到对数组进行排序之后第一个冒出来的想法,虽然不知道叫啥,但是很显而易见。其核心思想就是,先用第一个对后面的所有进行比较,遇到比自己小的就换位置,所以第一遍比下来,第一个位置的必定是最小的元素,接下来从第二个开始,与后面的元素一个一个比较,如此循环。

上代码:

<?php

function selection($arr){
	$sum = count($arr);
	for ($i=0; $i < $sum - 1; $i++) { 
		for ($j=$i + 1; $j < $sum; $j++) { 
			if ($arr[$i] > $arr[$j]) {
				$temp = $arr[$i];
				$arr[$i] = $arr[$j];
				$arr[$j] = $temp;
			}
		}
	}
	return $arr;
}
function selectiondesc($arr){
	$sum = count($arr);
	for ($i=0; $i < $sum - 1; $i++) { 
		for ($j=$i + 1; $j < $sum; $j++) { 
			if ($arr[$i] < $arr[$j]) {
				$temp = $arr[$i];
				$arr[$i] = $arr[$j];
				$arr[$j] = $temp;
			}
		}
	}
	return $arr;
}
$arr = array(3,2,9,5,4,6,8,7,1,0);
print_r(selectiondesc($arr));

注意的是,每次比较完之后,下一次的比较会比上次少一次。

插入排序:这个我想了很久,其实中心思想在,把当前的数组分为两个分区(partition),前面的是已排序的分区,后面是乱序的,首先我们把第一个元素视为有序的分区,然后选取这个元素后一个(被视为乱序分区的第一个元素)与有序分区的最后一个元素比较大小,若是无须的小于有序的则交换位置,否则不变,迭代下一个元素比较。

上代码:

<?php
function insert($arr){
	$sum = count($arr);
	for ($i=1; $i < $sum; $i++) { 
		$temp = $arr[$i];
		for ($j=$i - 1; $j >= 0; $j--) { 
			if ($arr[$j] > $temp) {
				$arr[$j + 1] = $arr[$j];  //注意,不可以使用$arr[$i],这里的j是动态的,不然会覆盖重写
				$arr[$j] = $temp;
			}
		}
		// return $arr;
	}
	return $arr;
}
$arr = array(3,2,9,5,4,6,8,7,1,0);
print_r(insert($arr));

重点在代码的注释里写了。

真的,基础算法很重要,最好弄透彻,平时多用。噶油。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值