2012-01-25 47 views
13

我需要在PHP中做一个气泡排序算法。PHP中的气泡排序实现?

我想知道是否有任何人有我可以使用的很好的例子,或者可以做到这一点的开源库。

我在一个集合(数组)中有几个空格,我想用对象(一个人)填充这些空间,所以没有空间可以有男性和女性,这就是为什么我要找出一个泡泡排序算法。

我的计划是填写任何可用的空间,不管性别如何,然后单独分类。

谢谢。

+0

请参见我的博客文章用简单的冒泡排序实现:http://blog.richardknop.com/2012/06/bubble-sort- algorithm-php-implementation/ –

回答

19

使用冒泡排序是一个非常糟糕的主意。它的复杂性为O(n^2)

您应该使用php usort,这实际上是合并排序实现并保证O(n*log(n))的复杂性。

从PHP手册样本代码 -

function cmp($a, $b) { 
    if( $a->weight == $b->weight){ return 0 ; } 
    return ($a->weight < $b->weight) ? -1 : 1; 
} 

usort($unsortedObjectArray,'cmp'); 
+0

但我的需要不仅是排序,我需要将这些对象(人)分配给空间 – nivanka

+0

是啊!你也可以那样做。顺便说一句,我想你没有得到我的解决方案。 – Rifat

+0

if($ a-> weight == $ b-> weight){return 0; } return($ a-> weight < $b-> weight)? -1:1; ---这是重要的东西吗? – nivanka

21
function bubble_sort($arr) { 
    $size = count($arr)-1; 
    for ($i=0; $i<$size; $i++) { 
     for ($j=0; $j<$size-$i; $j++) { 
      $k = $j+1; 
      if ($arr[$k] < $arr[$j]) { 
       // Swap elements at indices: $j, $k 
       list($arr[$j], $arr[$k]) = array($arr[$k], $arr[$j]); 
      } 
     } 
    } 
    return $arr; 
} 

例如:

$arr = array(1,3,2,8,5,7,4,0); 

print("Before sorting"); 
print_r($arr); 

$arr = bubble_sort($arr); 
print("After sorting by using bubble sort"); 
print_r($arr); 
+1

最好的排序算法是快速排序。与O(nlog(n)),是更快的算法排序。你可以在这里看到它:http://www.phptutorialonline.com/php-quicksort.aspx – JackTurky

+0

当没有交换时,你的循环不会停止。你应该使用while或打破循环 – user2997418

+0

@蒋艾伦如果他使用'foreach'循环会更快。 – FluorescentGreen5

5
 

$numbers = array(1,3,2,5,2); 
$array_size = count($numbers); 

echo "Numbers before sort: "; 
for ($i = 0; $i < $array_size; $i++) 
    echo $numbers[$i]; 
echo "n"; 

for ($i = 0; $i < $array_size; $i++) 
{ 
    for ($j = 0; $j < $array_size; $j++) 
    { 
     if ($numbers[$i] < $numbers[$j]) 
     { 
     $temp = $numbers[$i]; 
     $numbers[$i] = $numbers[$j]; 
     $numbers[$j] = $temp; 
     } 
    } 
} 

echo "Numbers after sort: "; 
for($i = 0; $i < $array_size; $i++) 
    echo $numbers[$i]; 
echo "n"; 
 
+0

感谢这一点,这看起来像@ JackTurky的答案一样。 – nivanka

0

也许有人觉得有用我的版本冒泡排序的:从上面的评论

function BubbleSort(&$L) 
{ 
    $rm_key = count($L); 
    while(--$rm_key > -1)#after this the very first time it will point to the last element 
     for($i=0; $i<$rm_key; $i++) 
      if($L[$i] > $L[$i+1]) 
       list($L[$i],$L[$i+1]) = array($L[$i+1],$L[$i]);   
} 

我交换想法(使用列表)。

2
function bubble_sort($arr) { 
    $n = count($arr); 
    do { 
     $swapped = false; 
     for ($i = 0; $i < $n - 1; $i++) { 
      // swap when out of order 
      if ($arr[$i] > $arr[$i + 1]) { 
       $temp = $arr[$i]; 
       $arr[$i] = $arr[$i + 1]; 
       $arr[$i + 1] = $temp; 
       $swapped = true; 
      } 
     } 
     $n--; 
    } 
    while ($swapped); 
    return $arr; 
} 
+0

嘿,谢谢你。我知道你没有赢,但这是我正在寻找的确切逻辑! – pappy

0
function bubbleSort(array $arr) 
    { 
     $n = sizeof($arr); 
     for ($i = 1; $i < $n; $i++) { 
      for ($j = $n - 1; $j >= $i; $j--) { 
       if($arr[$j-1] > $arr[$j]) { 
        $tmp = $arr[$j - 1]; 
        $arr[$j - 1] = $arr[$j]; 
        $arr[$j] = $tmp; 
       } 
      } 
     } 

     return $arr; 
    } 

    // Example: 
    $arr = array(255,1,22,3,45,5); 
    $result = bubbleSort($arr); 
    print_r($result); 
//==================================================== 
//------- improved version---------------------------- 
//====================================================  
function bubbleSortImproved(array $arr) 
{ 
    $n = sizeof($arr);  
    for ($i = 1; $i < $n; $i++) { 
     $flag = false; 
     for ($j = $n - 1; $j >= $i; $j--) { 
      if($arr[$j-1] > $arr[$j]) { 
       $tmp = $arr[$j - 1]; 
       $arr[$j - 1] = $arr[$j]; 
       $arr[$j] = $tmp; 
       $flag = true; 
      } 
     } 
     if (!$flag) { 
      break; 
     } 
    } 

    return $arr; 
} 

// Example: 
$arr = array(255,1,22,3,45,5); 
$result = bubbleSortImproved($arr); 
print_r($result); 
0

改进冒泡排序享受:)

$sortarr = array(3,5,15,3,2,6,7,50,1,4,5,2,100,9,3,2,6,7,13,18); 

    echo "<pre>"; 
    // Array to be sorted 
    print_r($sortarr); 
    // Sorted Array 
    print_r(bubble_sort($sortarr)); 
    echo "<pre>"; 

    function bubble_sort($sortarr){ 
     // Bubble sorting 
     $array_count = count($sortarr); 
     for($x = 0; $x < $array_count; $x++){ 
      for($a = 0 ; $a < $array_count - 1 ; $a++){ 
       if($a < $array_count){ 
        if($sortarr[$a] > $sortarr[$a + 1]){ 
          swap($sortarr, $a, $a+1); 
        } 
       } 
      } 
     } 
     return $sortarr;  
    } 

    function swap(&$arr, $a, $b) { 
     $tmp = $arr[$a]; 
     $arr[$a] = $arr[$b]; 
     $arr[$b] = $tmp; 
    }