PHP四种排序归纳与实现
排序:对一组数据,依据指定的规则顺序进行排列的过程!
- 1.冒泡排序
- 选定一个较大的元素为基准与前一个元素进行比较,较大的值下沉较小的值上升
- 算法:对一个数组进行循环比较,第一层循环比较次数为数组长度减一,其他内层循环为外层循环的次数减一
- 2.优化
- 排序比较耗费资源,通过优化可以使一些有序数组不进行循环排序,从而节约资源,减少访问时间
function maopao(&$arr)
{
//确定数组长度
$arr_size = count($arr);
//确定外层循环次数(数组长度减一)
//优化:定义一个标签并且初始化
$flage = 0;
for($i = 0;$i < $arr_size - 1; $i++)
{
//确定内层循环(当前外层循次数减一)
for($j = 0 ;$j <$arr_size - 1 -$i;$j++)
{
//元素比较排序(从小到大排序),如果前面的数据比后面的大则交换数据
if($arr[$j] < $arr[$j+1])
{
//定义中间量
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
//进行过比较改变标签状态;
$flage = 1;
}
}
//对标签状态进行判断
if($flage == 0)
{
//如果标签$flage==0标签状态没有改变,说明没有进行过比较,则该数据已经处于有序状态不需要进行排序则退出;
break;
}
elseif($flage == 1)
{
//如果标签$flage==1 说明数据最少进行过一次比较,则初始化标签继续进行比较
$falge = 0;
}
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
maopao($arr);
echo '<pre>';
print_r($arr);
echo "<hr>";
2.选择排序
- 算法:第一次在R[0]R[n-1]中选出最小值,把结果交给R[0];第二次在R[0+1]R[n-1]中选出最小值并把结果交给R[0+1];以此类推直到整个数组排序完毕!
function xuanzhe(&$arr)
{
//取得数组元素个数
$arr_size = count($arr);
//进行第一重循环
for($i = 0; $i < $arr_size-1 ;$i++)
{
// 假设$arr[$i]为最小值
$min_val = $arr[$i];
//$min_val_index为最小值的下标
$min_val_index = $i;
//第二层循环,求出最小值
for($j = $i+1;$j < $arr_size ;$j++ )
{
//判断,进行值交换
if($min_val > $arr[$j])
{
//重置最小值和下标
$min_val = $arr[$j];
$min_val_index = $j;
}
}
//进行值跟下标的交换并优化
//判断下标
if($min_val_index != $i)
{
$arr[$min_val_index] = $arr[$i];
$arr[$i] = $min_val;
}
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
xuanzhe($arr);
echo '<pre>';
print_r($arr);
echo "<hr>";
- 插入排序:
- 将一个数组拆分为一个有序数组和一个无序数组,将无序数组中的元素与有序数组中的元素进行比较并且插入
function insertsort(&$arr)
{
//计算数组长度
$arr_size = count($arr);
//第一次循环取数组第一个元素为有序数组,所以无序数组第一位下标为1
for($i = 1 ; $i < $arr_size ;$i++)
{
//先把$arr[$i]保存到$insterVal中防止被覆盖掉
$insertVal = $arr[$i];
//确定有序列表的最后一个元素的下标
$index = $i - 1;
while ($index >= 0 && $arr[$index] > $insertVal) {
//将$index下标对应的元素后移
$arr[$index + 1] = $arr[$index];
$index--;
}
//将$insertVal的值让到$index+1位
$arr[$index + 1] = $insertVal;
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
insertsort($arr);
echo '<pre>';
print_r($arr);
echo "<hr>";
4- 快速排序
- 快速排序算法是对冒泡算法的一个优化。他的思想是先对数组进行分割, 把大的元素数值放到一个临时数组里,把小的元素数值放到另一个临时数组里(这个分割的点可以是数组中的任意一个元素值,一般用第一个元素,即$array[0]),然后继续把这两个临时数组重复上面拆分,最后把小的数组元素和大的数组元素合并起来。这里用到了递归的思想。
function quicksort($arr){
$length = count($arr);
if($length<=1){
return $arr;
}else{
$left = array();
$right = array();
for($i=1;$i<$length;$i++){
if($arr[$i]<$arr[0]){
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
$left = quicksort($left);
$right = quicksort($right);
return array_merge($left,array($arr[0]),$right);
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
$result = quicksort($arr);
echo "<pre>";
print_r($result);
echo "</pre>";