2012-01-25 24 views
13

Necesito hacer un algoritmo de ordenación de burbujas en PHP.Implementación de clasificación de burbuja en PHP?

Quiero saber si alguien tiene algún buen ejemplo que pueda usar, o una biblioteca de código abierto que pueda hacer esto.

Tengo algunos espacios en un conjunto (matriz), quiero llenar estos espacios con el objeto (una persona), por lo que ningún espacio puede tener un macho y una hembra, esta es la razón por la que estoy tratando de encontrar una burbuja algoritmo de ordenación

Mi plan es completar cualquiera de los espacios disponibles, independientemente del género, y después de eso, ordenarlos por separado.

Gracias.

+0

Ver mi blog con la aplicación especie de burbuja sencilla: http://blog.richardknop.com/2012/06/bubble-sort- algorithm-php-implementation/ –

Respuesta

19

Usando ordenamiento de burbuja es una muy mala idea. Tiene una complejidad de O(n^2).

Debe usar php usort, que en realidad es una implementación de tipo de fusión y una complejidad O(n*log(n)) garantizada.

Un código de ejemplo del Manual de PHP -

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

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

pero mi necesidad no es solo clasificar, necesito asignar esos objetos (personas) a los espacios – nivanka

+0

¡Sí! Tu también puedes hacer eso. Por cierto, creo que no obtuviste mi solución correctamente. – Rifat

+0

if ($ a-> weight == $ b-> weight) {return 0; } return ($ a-> weight < $b-> weight)? -1: 1; --- esto es lo importante eh? – 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; 
} 

Por ejemplo:

$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

el mejor algoritmo de clasificación es de ordenación rápida. con O (nlog (n)), es el algoritmo más rápido para ordenar. usted puede verlo aquí: http://www.phptutorialonline.com/php-quicksort.aspx – JackTurky

+0

sus bucles no se detienen cuando no hay intercambio. debe usar while o romper el ciclo – user2997418

+0

@ 蒋艾伦 será aún más rápido si usa un ciclo '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

gracias por esto, esto se ve igual que la respuesta de @ JackTurky. – nivanka

0

Tal vez alguien encuentra útil mi versión de la burbuja Ordenar:

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]);   
} 

me dieron el (lista mediante) la idea de intercambio desde arriba comentario.

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

Oye, gracias por esto. Sé que no ganaste, ¡pero esta es la lógica exacta que estaba buscando! – 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

mejorado de la burbuja Clasificación disfrutar :)

$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; 
    } 
Cuestiones relacionadas