写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。相关的知识,希望对你有一定的参考价值。

冒泡法:

<?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四种基础算法:冒泡,选择,插入和快速排序法

 

以上是关于写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一个维数组。的主要内容,如果未能解决你的问题,请参考以下文章

面试官:写一个冒泡排序和快速排序吧

快速排序算法

用Turtle库写一个冒泡排序动画演示

算法入门五——快速排序算法(中)

快速排序

学习算法 -- 马桶排序冒泡排序和快速排序