PHP四种排序归纳与实现

PHP四种排序归纳与实现

排序:对一组数据,依据指定的规则顺序进行排列的过程!

  1. 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>";
  1. 插入排序:
  • 将一个数组拆分为一个有序数组和一个无序数组,将无序数组中的元素与有序数组中的元素进行比较并且插入
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>"; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值