搜索了哈php冒泡排序,网上写的不知道第二层循环都是递减的,很不符合我的习惯,既然是冒泡肯定是从下往上啊,所以索性自己写了个分享哈!
<?php
  $ar = array(1,3,2,8,3,5,6,10,13,27,24);
bubble_sort($ar);
print_r($ar);
 function bubble_sort(&$ar)
{
   $ar_count = count($ar);
   $temp = null;
   for($i= 0 ; $i < $ar_count; $i ++)
   {
      for($j = 0 ; $j < $ar_count - $i - 1; $j++)
      {
          if($ar[$j] > $ar[$j+1])
          {
              $temp = $ar[$j];
              $ar[$j] = $ar[$j+1];
              $ar[$j+1] = $temp;
          }
      }
   }
}
php冒泡排序

解决方案 »

  1.   

    $ar = array(24,1,3,2,8,3,5,6,10,13,27);
    bubble_sort($ar);function bubble_sort(&$ar)
    {
       $ar_count = count($ar);
       $temp = null;
       for($i= 0 ; $i < $ar_count; $i ++)
       {
          for($j = 0 ; $j < $ar_count - $i - 1; $j++)
          {
              if($ar[$j] > $ar[$j+1])
              {
                  $temp = $ar[$j];
                  $ar[$j] = $ar[$j+1];
                  $ar[$j+1] = $temp;
              }
          }
    echo join(',', $ar), PHP_EOL; //观察这里的输出
       }
    }1,3,2,8,3,5,6,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27 到这里排序已经结束
    1,2,3,3,5,6,8,10,13,24,27 从这里开始,以下都是无效劳动
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27大有优化的余地
      

  2.   

    恩!很好,PHP有一部分函数将这些算法给弄成函数了
      

  3.   

    版主同学 你真仔细。
    不过我这个只是面试时候对付哈别人出面试题,貌似网上写的排序算法都不是太好懂,所以才这样写,囧 实际项目中不会拿php做算法啊
    但是还是想问哈 你有什么好的优化建议?
      

  4.   

    php内置sort函数采用qsort,快速排序法。
    zend_qsort.cstatic void _zend_qsort_swap(void *a, void *b, size_t siz)
    {
    register char  *tmp_a_char;
    register char  *tmp_b_char;
    register int   *tmp_a_int;
    register int   *tmp_b_int;
    register size_t i;
    int             t_i;
    char            t_c; tmp_a_int = (int *) a;
    tmp_b_int = (int *) b; for (i = sizeof(int); i <= siz; i += sizeof(int)) {
    t_i = *tmp_a_int;
    *tmp_a_int++ = *tmp_b_int;
    *tmp_b_int++ = t_i;
    } tmp_a_char = (char *) tmp_a_int;
    tmp_b_char = (char *) tmp_b_int; for (i = i - sizeof(int) + 1; i <= siz; ++i) {
    t_c = *tmp_a_char;
    *tmp_a_char++ = *tmp_b_char;
    *tmp_b_char++ = t_c;
    }
    }ZEND_API void zend_qsort(void *base, size_t nmemb, size_t siz, compare_func_t compare TSRMLS_DC)
    {
    void           *begin_stack[QSORT_STACK_SIZE];
    void           *end_stack[QSORT_STACK_SIZE];
    register char  *begin;
    register char  *end;
    register char  *seg1;
    register char  *seg2;
    register char  *seg2p;
    register int    loop;
    uint            offset; begin_stack[0] = (char *) base;
    end_stack[0]   = (char *) base + ((nmemb - 1) * siz); for (loop = 0; loop >= 0; --loop) {
    begin = begin_stack[loop];
    end   = end_stack[loop]; while (begin < end) {
    offset = (end - begin) >> 1;
    _zend_qsort_swap(begin, begin + (offset - (offset % siz)), siz); seg1 = begin + siz;
    seg2 = end; while (1) {
    for (; seg1 < seg2 && compare(begin, seg1 TSRMLS_CC) > 0;
         seg1 += siz); for (; seg2 >= seg1 && compare(seg2, begin TSRMLS_CC) > 0;
         seg2 -= siz);

    if (seg1 >= seg2)
    break;

    _zend_qsort_swap(seg1, seg2, siz); seg1 += siz;
    seg2 -= siz;
    } _zend_qsort_swap(begin, seg2, siz); seg2p = seg2;

    if ((seg2p - begin) <= (end - seg2p)) {
    if ((seg2p + siz) < end) {
    begin_stack[loop] = seg2p + siz;
    end_stack[loop++] = end;
    }
    end = seg2p - siz;
    }
    else {
    if ((seg2p - siz) > begin) {
    begin_stack[loop] = begin;
    end_stack[loop++] = seg2p - siz;
    }
    begin = seg2p + siz;
    }
    }
    }
    }
      

  5.   

    最后交换变量那里,改成
    $ar[$j]^=$ar[$j+1]^=$ar[$j]^=$ar[$j+1];
      

  6.   

    是的,脑袋不好使啊。E:\>php test.php
    1,2,3,3,5,6,8,10,13,24,27
    1,2,3,3,5,6,8,10,13,24,27
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 3
        [4] => 5
        [5] => 6
        [6] => 8
        [7] => 10
        [8] => 13
        [9] => 24
        [10] => 27
    )
    <?php
      $ar = array(1,3,2,8,3,5,6,10,13,27,24);
    bubble_sort($ar);
    print_r($ar);
     function bubble_sort(&$ar)
    {
       $ar_count = count($ar);
       $temp = null;
       for($i= 0 ; $i < $ar_count; $i ++)
       {
          $flag = true;
          for($j = 0 ; $j < $ar_count - $i - 1; $j++)
          {
              if($ar[$j] > $ar[$j+1])
              {
                  $flag = false;
                  $temp = $ar[$j];
                  $ar[$j] = $ar[$j+1];
                  $ar[$j+1] = $temp;
              }
          }
          echo join(',', $ar), PHP_EOL; 
          if($flag)
            return;
       }
    }