为什么我的排序老是出现异常
function BubbleSort($arr)

    $num = count($arr); 
    for($i=0;$i <$num-1;$i++)

        for($j=0;$j<$num-$i-1;$j++)

            if($arr[$j] > $arr[$j+1])

                $iTemp = $arr[$j]; 
                $arr[$j] = $arr[$j+1]; 
                $arr[$j+1] = $iTemp; 
            } 
        } 
    } 
    return $arr; 
}总是出现这样的结果
Array ( [0] => [1] => 1 [2] => 24 [3] => 36 [5] => 82 [6] => 84 [7] => 44 [4] => 62 )

解决方案 »

  1.   

    $tes_arr = array(24,1,82,99,84,45,62);
    print_r(BubbleSort($tes_arr));
    Array ( [0] => 1 [1] => 24 [2] => 45 [3] => 62 [4] => 82 [5] => 84 [6] => 99 ) 测试没有问题。
      

  2.   


    function BubbleSort($arr) 

        $num = count($arr); 
        for($i=0;$i< $num; $i++)

    for($j=$i+1;$j< $num; $j++)

     if($arr[$j] > $arr[$i]) 
     { 
              $iTemp = $arr[$i]; 
              $arr[$i] = $arr[$j]; 
              $arr[$j] = $iTemp; 
              
     } 
      } 
        } 
        return $arr; 

      

  3.   


    <?php
    $arr = array(24,1,82,99,84,45,62);
    sort($arr);   //PHP本身就有数组排序函数
    print_r($arr);
      

  4.   

    function BubbleSort($arr) 

        $num = count($arr); 
        for($i=0;$i <$num;$i++) 

            for($j=$i;$j <$num;$j++) 

                if($arr[$i] > $arr[$j]) 

                    $iTemp = $arr[$i]; 
                    $arr[$i] = $arr[$j]; 
                    $arr[$j] = $iTemp; 
                } 
            } 
        } 
        return $arr; 
    }
      

  5.   


    算法太差.增加了时间复杂度,还用了中间变量..
    给你改写如下:<?php
    $arr = array(24,1,82,99,84,45,62);
    Function bsort(&$arr)
    {
      $num = count($arr); //先统计数组元素个数
      for($i=0;$i<$num;$i++)
      {
        for($j=$i+1;$j<$num;$j++)
        {
          $arr[$i]>$arr[$j]?$arr[$i]^=$arr[$j]^=$arr[$i]^=$arr[$j]:1;    }
      }
    }
    bsort($arr);
    print_r($arr);
      

  6.   

    居然代码中不能用颜色....再贴一次..恶心的编辑器..
    <?php
    $arr = array(24,1,82,99,84,45,62);
    Function bsort(&$arr)
    {
      $num = count($arr); //先统计数组元素个数
      for($i=0;$i<$num;$i++)
      {
        for($j=$i+1;$j<$num;$j++)
        {
          $arr[$i]>$arr[$j]?$arr[$i]^=$arr[$j]^=$arr[$i]^=$arr[$j]:1;
        }
      }
    }
    bsort($arr);
    print_r($arr);
      

  7.   

    我实际测试了一下:程序如下
    <?php
    function BubbleSort($arr)
    {
        $num = count($arr);
        for($i=0;$i <$num-1;$i++)
    {
            for($j=0;$j <$num-$i-1;$j++)
    {
                if($arr[$j] > $arr[$j+1])
    {
                    $iTemp = $arr[$j];
                    $arr[$j] = $arr[$j+1];
                    $arr[$j+1] = $iTemp;
                }
            }
        }
        return $arr;

    $aray = Array(); 
    $array = array(1,10, 11,156,15,61,19,13);
    print_r($array);
    print_r(BubbleSort($array));
    ?>
    结果如下:Array
    (
        [0] => 1
        [1] => 10
        [2] => 11
        [3] => 156
        [4] => 15
        [5] => 61
        [6] => 19
        [7] => 13
    )
    Array
    (
        [0] => 1
        [1] => 10
        [2] => 11
        [3] => 13
        [4] => 15
        [5] => 19
        [6] => 61
        [7] => 156
    )
    没有什么问题啊
      

  8.   

    单独的话是正确的 但是放到这里点击多次以后就会出现错误
    <?php function compositer() 

    $num = 10; 
    $start = 0; 
    $end = 100; 
    $ul_array = 0; while($ul_array <$num) 

    $a[]=rand($start,$end); 
    $ary=array_unique($a); 
    $ul_array=count($ary); 
    } foreach ($ary as $value) 

    echo $value.","; 

    return $ary; 
    } function BubbleSort($arr) 

        $num = count($arr); 

        for($i=0;$i < $num;$i++) 

            for($j=0;$j < $num;$j++) 

                if($arr[$i] < $arr[$j]) 

                    $iTemp = $arr[$i]; 
                    $arr[$i] = $arr[$j]; 
                    $arr[$j] = $iTemp; 
                } 
            } 
        }

        return $arr; 
    }if(isset($_POST['sub'])){
        session_start();
        if($_POST['sub']=='原数组') 
            $_SESSION['原数组']=compositer(); 
        if($_POST['sub']=='排序'){
            $My_array = BubbleSort($_SESSION['原数组']);
            echo "原数组:<br>";
            print_r($_SESSION['原数组']);
            echo '<br>';
            echo "排序数组:<br>";
            print_r($My_array); 
        }
    }?>
    <html> 
    <head> 
    <title>数组显示 </title> 
    </head> <body> 
    <form action="MyPhp.php"  method = "post"> 
    <input type = "submit" value = "原数组" name ="sub"/> 
    <input type = "submit" value = "排序" name = "sub" /> 
    </form></body> 
    </html> 
      

  9.   


    lz, 你为什么总把echo 语句放在 html 、body 之外?
    你最开始写的排序是Bubble Sort,你在10楼写的算法,不是Bubble Sort,是选择排序。
    同样,8楼syu 的算法,酷是酷了,但是也是选择排序,也不是bsort. 而且通过连续异或赋值来交换的方法和设中间交换变量temp的算法是一样的,不能提高一点效率。连续赋值一样要产生中间临时变量。
    不过,select sort 效率 比 Bubble Sort 一般情况下,肯定是高的。
      

  10.   

    把lz 的compositer里生成的数打印了一下才发现问题,
    array_unique 这个函数虽然发现重复的值,会unique化,但是数组下标却是不改变的。就是如果发现 arr[3]=arr[5],那么它会去掉arr[5],但是并不是arr[5]后面的数都会向前移动一个位置,就是说虽然arr[5]没了,但arr[6]不会移动到arr[5]的位置上。所以lz 的compositer产生的数组会有下标大于9的情况,所以出错。我还是建议把 echo 语句写在 <body></body>里。<html> 
    <head> 
    <title>数组显示 </title> 
    </head> <body> 
    <form action="MyPhp.php"  method = "post"> 
    <input type = "submit" value = "原数组" name ="sub"/> 
    <input type = "submit" value = "排序" name = "sub" /> 
    </form> 
    <?php function compositer() 

    $num = 10; 
    $start = 0; 
    $end = 100; 
    $ul_array = 0; $ary= array();//我改成这个样子了。lz可以用别的方法。
    for($i=0;$i<$num;$i++){
    while(in_array(($x= rand($start,$end)),$ary));
    $ary[]=$x;
    }
    print_r($ary);
    return $ary; 
    } function BubbleSort($arr){ 
        $num = count($arr); 
        for($i=1;$i <$num;$i++){ //你原来的BubbleSort排序没有问题。但是用选择排序一般会更好。
            for($j=$num-1;$j>=$i;$j--){ 
                if($arr[$j] <$arr[$j-1]){ 
                    $iTemp = $arr[$j-1]; 
                    $arr[$j-1] = $arr[$j]; 
                    $arr[$j] = $iTemp; 
                } 
            } 
        } 
        return $arr; 

    if(isset($_POST['sub'])){
    session_start();
    if($_POST['sub']=='原数组') 
    $_SESSION['原数组']=compositer(); 
    if($_POST['sub']=='排序'){
    $My_array = BubbleSort($_SESSION['原数组']);
    echo "原数组:<br>";
        print_r($_SESSION['原数组']);
    echo '<br>';
    echo "排序数组:<br>";
    print_r($My_array); 
    }
    }
    ?>
    </body> 
    </html>