PHP冒泡排序详解

来源:互联网 发布:windows to go下载 编辑:程序博客网 时间:2024/06/05 04:35
<?phpfunction BubbleSort($str)//定义一个名为BubbleSort的函数,它有一个参数叫$str,这个参数必须是一个数组,这个数组里包含需要排序的一系列字符。{for ($i=0;$i<count($str)-1;$i++) //count($str)的功能为统计数组中的元素数量,并返回这个数量值//第一层循环,外层循环,由于冒泡排序的原理为,每次都找最小(或每次都找最大,本例是演示每次都找最小的情况)的那个字符,找出一个最小(“大”)的字符算一次循环{for ($j=count($str)-2;$j>=$i;$j--)//内层循环,本次循环控制找最小(“大”)数的操作,由于每次要找出最大的数,必须拿一个数和每一个数对比,所以也是一个内层的循环操作{if($str[$j+1]<$str[$j])//比较,是$j+1位置的字符大,还是$j位置的字符比较大,如果$j位置的字符比较大,那么交换$str[$j+1]和$str[$j]以保证排列在前面的字符更小{$tmp = $str[$j+1]; //交换两个位置的东西,需要三个空位才能完成,就像交换一杯可乐和一杯牛奶需要另一个空杯子一样,$tmp可以说就是空杯子$str[$j+1]=$str[$j];//类似,有一杯牛奶,一杯可乐,我们想用牛奶杯装可乐,可乐杯装牛奶的话,就得进行这样的操作……$str[$j]=$tmp;//整个交换的过程可以描述为:先将牛奶倒入空杯,再将可乐倒入牛奶杯,然后再将原来空杯里的牛奶倒入可乐杯}}//内层循环每执行一次,就会多找出一个“最小”的字符(除了前面循环中已经找过了的)}//数组里有N个字符的话,循环就重复N-1次,这样才能完成排序return $str; //将排序后的结果返回,返回后跳出函数体,$str变量在内存中消失,而BubbleSort($str)的值就是$str所返回的值}//函数体定义完成标志我们称之为 end of function BubbleSort($str)$str = array(3,6,1,5,9,0,4,6,11);//组出一个存放随机序列的若干数字的数组print_r(BubbleSort($str)); //调用函数体?>
┃基本原理┃:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
┃算法过程┃:设想被排序的数组$arr[0..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,

从下往上扫描数组$arr时,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

<?php//冒泡排序(一维数组)function bubble_sort($array){$count = count($array);if ($count <= 0) return false;for($i=0; $i<$count-1; $i++){   for($j=$count-1; $j>$i; $j--)   {    //如果后一个元素小于前一个,则调换位置    if ($array[$j] < $array[$j-1])    {     $tmp = $array[$j];     $array[$j] = $array[$j-1];     $array[$j-1] = $tmp;    }   }}return $array;}//使用实例$arr = array(49, 38, 65, 97, 76, 13, 27);$arr = bubble_sort($arr);print_r($arr);?>

排序实现过程如下:
49   38   65   97   76   13   27
38   49   65 97   76   13   27               比较第1个和第2个数,小的放前边,大的放后边
38   49   65   97   76   13   27               比较第2个和第3个数,小的放前边,大的放后边
38   49   65   97   76   13   27               比较第3个和第4个数,小的放前边,大的放后边
38   49   65   76   97   13   27               比较第4个和第5个数,小的放前边,大的放后边
38   49   65   76   13   97   27               比较第5个和第6个数,小的放前边,大的放后边
38   49   65   76   13   27   97               比较第6个和第7个数,小的放前边,大的放后边
至此,第一趟比较结束,得到以下排序:
38   49   65   76   13   27   97  
然后按照第一趟排序的方法继续比较,直到完成排序。

<?php
//快速排序(数组排序)
function quick_sort($array)
{
if (count($array) <= 1) return $array;
$key = $array[0];   //把数组的第一个元素作为关键数据
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++)
{
   if ($array[$i] <= $key)
   $left_arr[] = $array[$i];
   else
   $right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
$arr = array(49, 38, 65, 97, 76, 13, 27);
$aResule = quick_sort($arr);
print_r($aResule);
快速查找算法过程:
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
  1)设置两个变量I、J,排序开始的时候:I=1,J=N-1;
  2)以第一个数组元素作为关键数据,赋值给X,即 X=A[0];
  3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于X的值,让该值与X交换(找到就行.找到后i大小不变);
  4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于X的值,让该值与X交换(找到就行.找到后j大小不变);
  5)重复第3、4步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)
49   38   65   97   76   13   27         这里49为关键数据
27   38   65   97   76   13   49         从后往前查找找第1个小于关键数据49的数27并与49交换位置
27   38   49   97   76   13   65         从前往后查找找第1个大于关键数据49的数65并与49交换位置
27   38   13   97   76   49   65         从后往前查找找第1个小于关键数据49的数13并与49交换位置
27   38   13   49   76   97    65         从前往后查找找第1个大于关键数据49的数97并与49交换位置
至此,49到了这组数据的中间位置,不能再继续查找下去。然后将该组数据分成以下三部分
{27   38   13}   49   {76   49   97}     {27   38   13}和{76    97   65}分别取出关键数据27、76按照以上方法排序
27   38   13      
13   38   27         从后往前查找找第1个小于关键数据27的数13并与27交换位置
13   27   38         从前往后查找找第1个大于关键数据27的数38并与27交换位置
到此,关键数据27到了中间位置,查询结束。
76    97   65         从后往前查找找第1个小于关键数据76的数65并与76交换位置
65   76   97         到此,关键数据76到了中间位置,查询结束。
最后三部分数据组合在一起,即为快速查找的结果:
13   27   38   49   65   76   97
-------------------------------------

//插入排序(一维数组)function insert_sort($arr){     $count = count($arr);     for($i=1; $i<$count; $i++){         $tmp = $arr[$i];         $j = $i - 1;         while($arr[$j] > $tmp){             $arr[$j+1] = $arr[$j];             $arr[$j] = $tmp;             $j--;         }     }     return $arr;}


●选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

//选择排序(一维数组)function select_sort($arr){     $count = count($arr);     for($i=0; $i<$count; $i++){         $k = $i;         for($j=$i+1; $j<$count; $j++){             if ($arr[$k] > $arr[$j])                 $k = $j;             if ($k != $i){                 $tmp = $arr[$i];                 $arr[$i] = $arr[$k];                 $arr[$k] = $tmp;             }         }     }     return $arr;}


冒泡排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

//冒泡排序(一维数组)function bubble_sort($array){     $count = count($array);     if ($count <= 0) return false;     for($i=0; $i<$count; $i++){         for($j=$count-1; $j>$i; $j--){             if ($array[$j] < $array[$j-1]){                 $tmp = $array[$j];                 $array[$j] = $array[$j-1];                 $array[$j-1] = $tmp;             }         }     }     return $array;} 


●快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

//快速排序(一维数组)function quick_sort($array){if (count($array) <= 1) return $array;$key = $array[0];$left_arr = array();$right_arr = array();for ($i=1; $i<count($array);$i++){   if ($array[$i] <= $key)$left_arr[] = $array[$i];else$right_arr[] = $array[$i];   }   $left_arr = quick_sort($left_arr);   $right_arr = quick_sort($right_arr);   return array_merge($left_arr, array($key), $right_arr);}