PHP常用排序算法

1. 冒泡排序

思路分析:在要排序的一组数中,对当前还未拍好的序列,从前往后对相邻的两个数一次进行比较和调整,让较大的数往下沉,较小的数往上冒。也就是每俩个当相邻的数比较厚发现他们的排序与排序要求相反时,就将他们互换

代码实现:

<?php
	function bubbleSort($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+1];
					$arr[$j+1] = $arr[$j];
					$arr[$j] = $tmp;
				}
			}
		}
		return $arr;
	}
	
	$arr = array(5,3,4,2,1,6,3);
	$res = bubbleSort($arr);
2. 插入排序

思路分析 :在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插入到前面有序数列中,让这个n个数也是排好顺序的。反复循环,直到完全排好序

<?php
function insertSort($arr) {
	$len = count($arr);
	for ($i = 1; $i < $len; $i++) {
		$tmp = $arr[$i];
		for ($j = $i-1;$j >= 0; $j --) {
			if ($tmp < $arr[$j]) {
				//如果插入元素小,交换位置
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $tmp;
			} else {
				//如果不需要移动,直接break,前面数组已经排好了,不需要再次比较前面的数值
				break;
			}
		}	
	}
	return $arr;
}
$arr = array(5,3,4,2,1,6,3);
$res = insertSort($arr);
3.选择排序

思路分析:再要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数中在选个最小的与第二个位置的数交换,一直循环到倒数第二个数和最后一个数比较为止。

<?php
function selectSort() {
	//外层控制轮询数,内层控制比较次数
	$len = count($arr);
	for ($i = 0; $i < $len-1; $i++) {
		$p = $i;//假设当前最小值位置是$i
		for ($j = $i+1$j < $len; $j++) {
			if ($arr[$p] > $arr[j]) {
				//发现更小的,p记录最小值位置,下次比较时使用
				$p = $j;
			}
		}
		//已经确定最小值位置,保存到$p中,如果最小位置与当前假设位置$i不同,则位置互换 
		if ($p !$= $i) {
			$tmp = $arr[$p];
			$arr[$p] = $arr[$j];
			$arr[$j] = $tmp;
		}
	}
	return $arr;
}
$arr = array(5,3,4,2,1,6,3);
$res = selectSort($arr);
4.快速排序

思路分析:选择一个基准元素,通常选择第一个或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素再起排好序后的正确位置,然后在用同样的方法递归的排序划分的两部分。
代码实现:

<?php
function quickSort($arr) {
	$len = count($arr);
	if ($len <= 1) {
		return $arr;
	}
	//选择第一个元素作为基准
	$baseNum = $arr[0];
	//遍历出标尺之外的所有元素,按照大小关系放入两个数组内
	$leftArr = array();
	$rightArr = array();
	for ($i = 1;$i < $len; $i++) {
		if ($baseNum > $arr[$i]) {
			$leftArr[] = $arr[$i];
		} else {
			$rightArr[] = $arr[$i];
		}
	}
	//在分别对左右数组进行相同处理方式递归调用,最后合并数组
	$leftArr = quickSort($leftArr);
	$rightArr = quickSort($rightArr);
	return array_merge($leftArr, array($baseNum),$rightArr);
}
$arr = array(5,3,4,2,1,6,3);
$res = quickSort($arr);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值