php冒泡排序

十一文 滴滴打车 开发组长/高级工程师/技术专家  2013-01-30 10:34:25
搜索了哈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;
}
}
}
}
...全文
554 13 点赞 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
FanErfs 2013-01-31
好东西 收藏了
  • 打赏
  • 举报
回复
wlqf366 2013-01-31
引用 11 楼 happypiggy2010 的回复:
引用 1 楼 david026 的回复:好吧,我承认我是来接分,谢谢分享了 我也是。
我也是。
  • 打赏
  • 举报
回复
happypiggy2010 2013-01-31
引用 1 楼 david026 的回复:
好吧,我承认我是来接分,谢谢分享了
我也是。
  • 打赏
  • 举报
回复
十一文 2013-01-30
引用 9 楼 xuzuning 的回复:
引用 6 楼 xming4321 的回复:但是还是想问哈 你有什么好的优化建议?不是很明显吗? 当没有出现内层交换时就退出!
是的,脑袋不好使啊。 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;
   }
}
  • 打赏
  • 举报
回复
xuzuning 2013-01-30
引用 6 楼 xming4321 的回复:
但是还是想问哈 你有什么好的优化建议?
不是很明显吗? 当没有出现内层交换时就退出!
  • 打赏
  • 举报
回复
an9ryfr09 2013-01-30
引用 6 楼 xming4321 的回复:
引用 3 楼 xuzuning 的回复:PHP code?123456789101112131415161718192021$ar = array(24,1,3,2,8,3,5,6,10,13,27);bubble_sort($ar); function bubble_sort(&amp;$ar){ $ar_count = count($ar); $tem……
最后交换变量那里,改成 $ar[$j]^=$ar[$j+1]^=$ar[$j]^=$ar[$j+1];
  • 打赏
  • 举报
回复
an9ryfr09 2013-01-30
php内置sort函数采用qsort,快速排序法。


zend_qsort.c

static 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;
}
}
}
}
  • 打赏
  • 举报
回复
十一文 2013-01-30
引用 3 楼 xuzuning 的回复:
PHP code?123456789101112131415161718192021$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 ; ……
版主同学 你真仔细。 不过我这个只是面试时候对付哈别人出面试题,貌似网上写的排序算法都不是太好懂,所以才这样写,囧 实际项目中不会拿php做算法啊 但是还是想问哈 你有什么好的优化建议?
  • 打赏
  • 举报
回复
韩誉 2013-01-30
恩!很好,PHP有一部分函数将这些算法给弄成函数了
  • 打赏
  • 举报
回复
huicaier 2013-01-30
sort()不直接就解决了吗
  • 打赏
  • 举报
回复
xuzuning 2013-01-30
$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 大有优化的余地
  • 打赏
  • 举报
回复
louqqson007 2013-01-30
谢谢分享了 学习下
  • 打赏
  • 举报
回复
david026 2013-01-30
好吧,我承认我是来接分,谢谢分享了
  • 打赏
  • 举报
回复
相关推荐
发帖
基础编程
加入

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2013-01-30 10:34
社区公告
暂无公告