php 冒泡排序 快速排序

<?php

/******

  1. 冒泡排序:两两交换数值,最小的值在最左边,就如最轻的气泡在最上边。对整列数两两交换一次,最小的数在最左边,每次都能得一个在剩下的数中的最小 的数,“冒”出来的数组成一个有序区间,剩下的值组成一无序区间,且有序区间中每一元素值都比无序区间的小。  
  2.   
  3. 快速排序:基准数,左右二个数组,递归调用,合并。  
  4.   
  5. 插入排序:排序区间分成二部分,左边有序,右边无序,从右区间取第一个元素插入左区间,若此元素比左边区间最右边的元素大,留在原处,若此元素比左 边区间最右边的元素小,则插在最右边元素的原位置,同时最右边元素右移一位,计算器减一,重新和前面的元素比较,直到前面的元素比要插入元素小为止,重复 上述步骤。  
  6.   
  7. 注意区间端点值的处理,及数组的第一个元素下标为0.

***/

$a=array('3','8','1','4','11','7');
print_r($a);
$len = count($a);
//从小到大
for($i=1;$i<$len;$i++)
{
for($j=$len-1;$j>=$i;$j--)
if($a[$j]<$a[$j-1])
{//如果是从大到小的话,只要在这里的判断改成if($b[$j]>$b[$j-1])就可以了
 $x=$a[$j];
 $a[$j]=$a[$j-1];
 $a[$j-1]=$x;
}
}
print_r($a);j

//另一种方法 从小到大

$b=array('4','3','8','9','2','1');
$len=count($b);
for($k=1;$k<$len;$k++)
{
for($j=$len-1,$i=0;$i<$len-$k;$i++,$j--)
if($b[$j]<$b[$j-1]){

//如果是从大到小的话,只要在这里的判断改成if($b[$j]>$b[$j-1])就可以了
 $tmp=$b[$j];
 $b[$j]=$b[$j-1];
 $b[$j-1]=$tmp;
}
print_r($b);
echo "<br>";
}

//下面的这个执行效率更高

function maopao($arr)
{
 $len = count($arr);
 for($i=1; $i<$len;$i++)//最多做n-1趟排序
 {
  $flag =false;   //本趟排序开始前,交换标志应为假
  for($j=$len-1;$j>=$i;$j--)
  {
   if($arr[$j]<$arr[$j-1])//交换记录
   {//如果是从大到小的话,只要在这里的判断改成if($arr[$j]>$arr[$j-1])就可以了
    $x=$arr[$j];
    $arr[$j]=$arr[$j-1];
    $arr[$j-1]=$x;
    $flag = true;//发生了交换,故将交换标志置为真
   }
  }
  if(!$flag)//本趟排序未发生交换,提前终止算法
  return$arr;   
 }
}
$shuz = array('2','4','1','8','5');
$bb = maopao($shuz);
print_r($bb);

// 快速排序
function kuaisu($arr){
    $len =count($arr);
    if($len<= 1){
       return $arr;
    }
    $key =$arr[0];
    $left_arr =array();
    $right_arr =array();
    for($i=1;$i<$len;$i++){
       if($arr[$i] <= $key){
           $left_arr[] = $arr[$i];
       }else{
           $right_arr[] = $arr[$i];
       }
    }
    $left_arr =kuaisu($left_arr);
    $right_arr =kuaisu($right_arr);
    returnarray_merge($left_arr, array($key), $right_arr);
}
$arr = array(23,98,54,2,9,62,34);
print_r(kuaisu($arr));
?>

原文地址:https://www.cnblogs.com/sunscheung/p/4839418.html