使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组。

<?php
//冒泡排序(一维数组)
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;
	}
//使用实例
$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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值