首页 > 代码库 > 写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。
写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。
冒泡法:
<?php function bubbleSort($str){ $_count=count($str); for($i=0;$i<$_count;$i++){ for($j=$i+1;$j<$_count;$j++){ if($str[$j]>$str[$i]){ $tem=$str[$j]; $str[$j]=$str[$i]; $str[$i]=$tem; } } } return $str; } $str=array(8,5,4,3,32,2.4,54,59,6,7,); print_r($str); print_r(bubbleSort($str));
输出结果:
Array ( [0] => 8 [1] => 5 [2] => 4 [3] => 3 [4] => 32 [5] => 2.4 [6] => 54 [7] => 59 [8] => 6 [9] => 7 ) Array ( [0] => 59 [1] => 54 [2] => 32 [3] => 8 [4] => 7 [5] => 6 [6] => 5 [7] => 4 [8] => 3 [9] => 2.4 )
快速排序法:
<?php function qkSort($str){ $_count=count($str); if($_count<2) return $str; $standard=$str[0]; $_left=$_right=array(); for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left[]=$str[$i]; }else{ $_right[]=$str[$i]; } } $_left=qkSort($_left); $_right=qkSort($_right); return array_merge($_left,array($standard),$_right); } $str=array(8,5,4,3,32,2.4,54,59,6,7,); print_r($str); print_r(qkSort($str));
运行结果:
Array ( [0] => 8 [1] => 5 [2] => 4 [3] => 3 [4] => 32 [5] => 2.4 [6] => 54 [7] => 59 [8] => 6 [9] => 7 ) Array ( [0] => 59 [1] => 54 [2] => 32 [3] => 8 [4] => 7 [5] => 6 [6] => 5 [7] => 4 [8] => 3 [9] => 2.4 )
在写快速排序法时,出现了很多错误
1、在中间写for循环代码时,当时考虑到尽量减少计算,提高效率,写成了
for($i=0;$i<$_count;$i++){ if($str[$i+1]>$standard){ $_left[]=$str[$i+1]; }else{ $_right[]=$str[$i+1]; } }
运行时出现:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65488 bytes) in C:\AppServ\www\test2.php on line 14
原因为$str[$i+1]出现键值溢出。所以最厚修改成:
for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left[]=$str[$i]; }else{ $_right[]=$str[$i]; } }
错误消失。
2、忘记数组的使用规则,给$_left、$_right,两个均赋予数组变量;
$_left=$_right=array();
但是在运行时,没有使用[],
$_left=$_right=array(); for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left=$str[$i]; }else{ $_right=$str[$i]; } }
运行时候出现错误
Warning: array_merge(): Argument #1 is not an array in C:\AppServ\www\test2.php on line 16
说明在fisrt argument #1出现了错误
在for语句后面增加数组判断语句:
for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left=$str[$i]; }else{ $_right=$str[$i]; } } if(!!is_array($_left)){ echo ‘数组‘; }else{ echo ‘非数组‘; }
结果输出:非数组。
若将其更改为
for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left()=$str[$i]; }else{ $_right()=$str[$i]; } }
为小括号(),而不是[]。最终报错
Fatal error: Can‘t use function return value in write context in C:\AppServ\www\test2.php on line 9
最后将其更定为:
for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left[]=$str[$i]; }else{ $_right[]=$str[$i]; } }
运行通过。
3、再写函数array_merge时,出现错误。
第一次写成了
return array_merge($_left,$standard,$_right);
运行出错
Warning: array_merge(): Argument #2 is not an array in C:\AppServ\www\test2.php on line 16
出错的原因是因为第二个变量不是数组,而是字符串。
最终改为
return array_merge($_left,array($standard),$_right);
运行通过。
同样,如果是
return array_merge($_left,$str[0],$_right);
错误是一样的,依然是
Warning: array_merge(): Argument #2 is not an array in C:\AppServ\www\test2.php on line 16
应修改为:
return array_merge($_left,array($str[0]),$_right);
4、由于快速排序法涉及到递归,所以必须写递归函数“跳出递归”的判断。
如果将
if($_count<2) return $str;
去掉,则会出错:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in C:\AppServ\www\test2.php on line 6
上述两个仅针对索引数据,如果是关联数据,则失败。
如 学生 名字~成绩 排序
冒泡法:
<?php function bubbleSort($str){ $_count=count($str); for($i=0;$i<$_count;$i++){ for($j=$i+1;$j<$_count;$j++){ if($str[$j]>$str[$i]){ $tem=$str[$j]; $str[$j]=$str[$i]; $str[$i]=$tem; } } } return $str; } $str=array("王二"=>99,"张三"=>66,"李四"=>87,"赵五"=>100,"小七"=>95); print_r($str); print_r(bubbleSort($str));
输出结果:
Array ( [王二] => 99 [张三] => 66 [李四] => 87 [赵五] => 100 [小七] => 95 ) Array ( [王二] => 99 [张三] => 66 [李四] => 87 [赵五] => 100 [小七] => 95 )
快速排序法:
<?php function qkSort($str){ $_count=count($str); if($_count<2) return $str; $standard=$str[0]; $_left=$_right=array(); for($i=1;$i<$_count;$i++){ if($str[$i]>$standard){ $_left[]=$str[$i]; }else{ $_right[]=$str[$i]; } } $_left=qkSort($_left); $_right=qkSort($_right); return array_merge($_left,array($str[0]),$_right); } $str=array("王二"=>99,"张三"=>66,"李四"=>87,"赵五"=>100,"小七"=>95); print_r($str); print_r(qkSort($str));
输出结果:
Array ( [王二] => 99 [张三] => 66 [李四] => 87 [赵五] => 100 [小七] => 95 ) Array ( [0] => [1] => [2] => [3] => [4] => )
这需要倚重数组的处理关系进行处理
参考数据:
Warning: array_merge(): Argument #1 is not an array, when processing two $_POST
PHP Warning: array_merge() : Argument #1 is not an array in...错误解决方法
array_merge官网函数说明
PHP array_merge() 函数W3school
php实现快速排序
php四种基础算法:冒泡,选择,插入和快速排序法
写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。