PHP常用排序算法

一、冒泡排序

/**
 * 冒泡排序
 * @param array $arr
 * @return array
**/
function bubbleSort($arr) 
{
	$length = count($arr);
	// 从数组键为0开始循环到最后一个
	for($i = 0; $i < $length; $i++){
		// 从数组键为$i+1开始循环到最后一个
		for($j = $i+1; $j < $length; $j++){
			// 比较数组两个相邻值的大小
			if($arr[$i] > $arr[$j]){
				$temp = $arr[$i]; // 临时变量储存$i的值
				$arr[$i] = $arr[$j]; // 第一次更换位置
				$arr[$j] = $temp; // 完成位置互换
			}
		}
	}
	return $arr;
}
$result = bubbleSort($arr);

二、快速排序

/**
 * 快速排序
 * @param array $arr
 * @return array
**/
function quickSort($arr)
{
	$length = count($arr);
	// 先判断是否需要继续进行
	if($length <= 1) return $arr;
	// 初始化两个数组
	$leftArray = []; // 小于基准的放左边数组
	$rightArray = []; // 大于基准的放右边数组
	for($i = 1; $i < $length; $i++){ // 遍历基准值以外的所有元素,按大小关系放入两个数组内
		if($arr[$i] <= $arr[0]){
			$leftArray[] = $arr[$i];
		}else{
			$rightArray[] = $arr[$i];
		}
	}
	// 对左右两个数组进行相同的排序处理方式递归调用这个函数
	$leftArray = quickSort($leftArray);
	$rightArray = quickSort($rightArray);
	// 合并左数组、基准值、右数组
	return array_merge($leftArray, array($arr[0]), $rightArray);
}
$result = quickSort($arr);

三、选择排序

/**
 * 选择排序
 * @param array $arr
 * @return array
**/
function selectSort($arr)
{
	$length = count($arr);
	for($i = 0;$i < $length-1;$i++){
		// 先假设最小的值的位置
		$p = $i;
		for($j=$i+1;$j < $length;$j++){
			// $arr[$p]是当前已知的最小值
			if($arr[$p] > $arr[$j]){
				// 比较,发现更小的,记录下最小值的位置
				$p = $j;
			}
		}
		// 已经确定当前的最小值的位置,保存到$p中;如果发现最小值的位置与当前假设的位置$i不一致,则位置互换即可。
		if($p != $i){
			$temp = $arr[$p];
			$arr[$p] = $arr[$i];
			$arr[$i] = $temp;
		}
	}
	return $arr;
}
$result = selectSort($arr);

四、插入排序

/**
 * 插入排序
 * @param array $arr
 * @return array
**/
function insertSort($arr)
{	
	$length = count($arr);
	for($i=1;$i<$length;$i++){
		$temp = $arr[$i];
		// 内层循环控制,比较并插入
		for($j=$i-1;$j>=0;$j--){
			if($temp < $arr[$j]){
				// 发现插入的元素要小,交换位置,将后面的元素与前面的元素互换
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $temp;
 			}else{
 				// 如果碰到不需要移动的元素,由于已经是排序好的数组,则前面的就不需要再次比较了。
 				break;
 			}
		}
	}
	return $arr;
}
$result = insertSort($arr);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值