Ir al contenido


Foto

Metodo de ordenacion por QuickSort de java a php


  • Por favor identifícate para responder
7 respuestas en este tema

#1 HotaruV

HotaruV

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 10 octubre 2012 - 05:24

Hola a todos..
estuve estudiando el algoritmo para utilizar el metodo de ordenacion de datos llamado QuickSort, y pues realice el codigo en java con mucha facilidad, ya que es el lenguaje de programacion que manejo, al encontrar la utilizad de este codigo en java quize pasarlo a php ya que pienso que tambien podria ser muy util.. el problema es que no recuerdo muchas cosas de php y me gustaria que me ayudaran a pasar el codigo java a codigo php..  el problema es que no me acuerdo como enviar valores de retorno =/

el codigo es el siguiente en java
[java]
public class ordenador {
    int aux,cont1,cont2;
    boolean cambios;
   
    public int[] ordQuickSort(int num[]){
        PrintArray(num);
        return quicksort2(num,0,num.length-1);
    }
    private int[] quicksort2(int num[],int PuntIzq,int PuntDer){
        if(PuntIzq>=PuntDer){
            return num;
        }
        int i = PuntIzq,d = PuntDer;
        if(PuntIzq!=PuntDer){
            int piv;
            int aux1;
            piv = PuntIzq;
           
            while(PuntIzq!=PuntDer){
                while(num[PuntDer]>=num[piv]&&PuntIzq<PuntDer){
                    PuntDer--;
                }
                    while(num[PuntIzq]<num[piv]&&PuntIzq<PuntDer){
                        PuntIzq++;
                    }
                    if(PuntDer!=PuntIzq){
                        aux1 = num[PuntDer];
                        num[PuntDer]= num[PuntIzq];
                        num[PuntIzq]= aux1;
                        PrintArray(num);
                    }
                    if(PuntIzq==PuntDer){
                        quicksort2(num, i, PuntIzq-1);
                        quicksort2(num, PuntIzq+1, d);
                    }
                   
            }
        }else
            return num;
        return num;
    }
    private void PrintArray(int[] arr){
       
        String imp= "";
        for (int i = 0; i < arr.length; i++) {
           
            if(i != arr.length-1){
                imp = imp + arr[i]+",";
            }else{
                imp = imp + arr[i]+"";
            }
        }
        System.out.println("Interaccion numero: "+ imp);
       
    }
}
[/java]

Este codigo funciona perfectamente en java.. y bueno en php esto es lo que tengo

<?php
class quickSort{

private $num;
private $arr;

public function __construct(){
$this->num = array();
$this->arr = array();

}
public function ordQuickSort($num){
printArray($num);
return quicksort2($num,0,num.length-1);
}
private function quicksort2($num, $puntIzq, $puntDer){
if(PuntIzq>=PuntDer){
            return num;
$i = $puntIzq;
$d = $puntDer;

if($puntIzq!=$puntDer){
$piv;
$aux;
$piv = $puntIzq;

while($puntIzq!=$puntDer){
while($num[$PuntDer]>=$num[$piv]&&$PuntIzq<$PuntDer){
$puntDer--;
}
while($num[$PuntIzq]<$num[$piv]&&$PuntIzq<$PuntDer){
                        $PuntIzq++;
}
    if($puntDer!=$puntIzq){
$aux = $num[$puntDer];
$num[$puntDer]= $num[$puntIzq];
$num[$puntIzq]= $aux;
printArray();
}
if($puntIzq==$puntDer){
quicksort2($num,$i,$puntIzq-1);
quicksort2($num, $PuntIzq+1, $d);

}
}
}else{
return $num;
}
return $num;
}
}
private function printArray($arr){
$imp = "";
for($i = 0; $i < sizeof($arr); $i++){
if($i != sizeof($arr)){
$imp = $imp + $arr[$i] . ",";
}else{
$imp = $imp + $arr[$i] . "";
}
}
}
}
?>
<?php

?>


Eso seria lo que he hecho.. tengo problemas con los metodos que envian un tipo de dato de retorno...
por su respuesta Muchas gracias. =)
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 11 octubre 2012 - 10:28

en php no existe el tipeado fuerte a menos que este se declare de manera explícita.... por tanto php define el tipo de dato por el contexto en que es usada la variable... de ahí que operaciones como


  $numero = 1;
  $Letra = 'a';
  $numero =  $numero + $Letra;



sean totalmente válidas...  Por esto. tu puedes devolver cualquier tipo de datos o referencias a objetos como valor de retorno en una función....

en php este código  System.out.println("Interaccion numero: "+ imp);  puede traducirse como

echo "Interaccion numero:  $imp ";




espero que haya sido de ayuda...
  • 0

#3 HotaruV

HotaruV

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 11 octubre 2012 - 04:42

Hola gracias poliburro tu informacion me ha servido para corregir muchos errores de mi codigo.. por lo menos ya detecte porque no me tomaba el valor de las variables.. tengo otraduda que considero muy boba... pero siguo sin encontrar solucion.
tengo este pedacito de codigo..



private function printArray($arr){
for($i = 0; $i < count($arr); $i++){
if($i != count($arr)){
$imp = $arr[$i].",";
}else{
$imp = $arr[$i]."";
}
echo  $imp;
}
  }
$vector = array(3,4,5,6,7,2,8,1);
printArray($vector)


me imprime 3,4,5,6,7,2,8,1,

Bueno cesar dice que use return pero lo que necesito es que esta funcion en mi clase imprima el array desorrdenado.. osea tal y como lo paso bueno el caso es que quiero que cuando se imprima el array en el ultimo numero no aparezca la coma..

Gracias por su respuesta
  • 0

#4 HotaruV

HotaruV

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 11 octubre 2012 - 05:19

ups .. ya resolvi lo anterior ..  el codigo quedo asi

private function printArray($arr){
for($i = 0; $i < sizeof($arr); $i++){
if($i != sizeof($arr)-1){
$imp = $arr[$i].",";
}else{
$imp = $arr[$i]."";
}
echo  $imp;
}
  }



  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 11 octubre 2012 - 07:19

ups .. ya resolvi lo anterior ..  el codigo quedo asi


private function printArray($arr){
for($i = 0; $i < sizeof($arr); $i++){
if($i != sizeof($arr)-1){
$imp = $arr[$i].",";
}else{
$imp = $arr[$i]."";
}
echo  $imp;
}
  }




Muy bien amigo.... gracias por compartirnos la solución...
  • 0

#6 HotaruV

HotaruV

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 12 octubre 2012 - 06:30

Bueno al fin lo consegui....  Metodo quickSort en php .... un gusto compartirlo con todos ustedes... y para lo que se preguntan que hace este metodo.. sirve para ordenar los elementos de un array, es un algoritmo bastante interesante... y una utilizad que tal pueda tener es la de que las busquedas en base de datos sea mas rapida sobre todo cuando tiene muchos elementos ... ojala les sirva =)


<?php
class quickSort{

private $num = array();
private $arr = array();


public function __construct(){
$this->num = array();
$this->arr = array();



}
public function ordQuickSort($num){
$tra = new quickSort();
$tra->printArray($num);
$tra->quicksort2($num, 0, sizeof($num)-1);


}
private function quicksort2($num,$puntIzq,$puntDer ){
if($puntIzq >= $puntDer){
            return $num;
}

$i = $puntIzq;
$d = $puntDer;
if($puntIzq!=$puntDer){

$tra = new quickSort();
$piv=0;
$aux=0;
$piv = $puntIzq;

while($puntIzq!=$puntDer){
while($num[$puntDer]>=$num[$piv]&&$puntIzq<$puntDer){
$puntDer--;
}
while($num[$puntIzq]<$num[$piv]&&$puntIzq<$puntDer){
$puntIzq++;


}
if($puntDer!=$puntIzq){
$aux = $num[$puntDer];
$num[$puntDer] = $num[$puntIzq];
$num[$puntIzq] = $aux;
$tra->printArray($num);

}
if($puntIzq==$puntDer){

$tra->quicksort2($num,$i,$puntIzq -1);
$tra->quicksort2($num, $puntIzq+1,$d);
}
}
}else{
return $num;
}
return $num;
}



private function printArray($arr){
for($i = 0; $i < sizeof($arr); $i++){
if($i != sizeof($arr)-1){
$imp = $imp . $arr[$i].", ";
}else{
$imp = $imp . $arr[$i]."";
}
}
echo  "Interaccion: ".$imp."<br>";
}
 
}
?>
<?php
$num = array(22,45,76,3,65,34,64,74,23,67);
$tra = new quickSort();
$tra->ordQuickSort($num);
       
?>


e imprime lo siguiente:

Interaccion: 22, 45, 76, 3, 65, 34, 64, 74, 23, 67 <------------ Array Original
Interaccion: 3, 45, 76, 22, 65, 34, 64, 74, 23, 67
Interaccion: 3, 23, 76, 22, 65, 34, 64, 74, 45, 67
Interaccion: 3, 22, 76, 23, 65, 34, 64, 74, 45, 67
Interaccion: 3, 22, 67, 23, 65, 34, 64, 74, 45, 76
Interaccion: 3, 22, 45, 23, 65, 34, 64, 74, 67, 76
Interaccion: 3, 22, 34, 23, 65, 45, 64, 74, 67, 76
Interaccion: 3, 22, 23, 34, 65, 45, 64, 74, 67, 76
Interaccion: 3, 22, 23, 34, 64, 45, 65, 74, 67, 76
Interaccion: 3, 22, 23, 34, 45, 64, 65, 74, 67, 76
Interaccion: 3, 22, 23, 34, 45, 64, 65, 67, 74, 76 <--------- Array Ordenado

y por ejemplo si le paso al array cadenas de caracteres:

$num = array('zorro','toro','murcielago','urraca','gato','rata','suricata','bufalo','perro','ave');
$tra = new quickSort();
$tra->ordQuickSort($num);

Imprimira lo siguiente:

Interaccion: zorro, toro, murcielago, urraca, gato, rata, suricata, bufalo, perro, ave <---array origina
Interaccion: ave, toro, murcielago, urraca, gato, rata, suricata, bufalo, perro, zorro
Interaccion: ave, perro, murcielago, urraca, gato, rata, suricata, bufalo, toro, zorro
Interaccion: ave, bufalo, murcielago, urraca, gato, rata, suricata, perro, toro, zorro
Interaccion: ave, bufalo, gato, urraca, murcielago, rata, suricata, perro, toro, zorro
Interaccion: ave, bufalo, gato, toro, murcielago, rata, suricata, perro, urraca, zorro
Interaccion: ave, bufalo, gato, perro, murcielago, rata, suricata, toro, urraca, zorro
Interaccion: ave, bufalo, gato, murcielago, perro, rata, suricata, toro, urraca, zorro <--- array ordenado alfabeticamente


por cierto hay codigo ya escrito en php sobre este metodo, pero no encontre ninguno que estuviese dirigido a POO ... y esta es una clase que puede ser reutilizada.. 
  • 0

#7 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 12 octubre 2012 - 07:08

Caray amigo.. que gusto que hayas logrado implementar el algoritmo en php.... Muchas gracias por compartirlo con la comunidad...

saludox
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 12 octubre 2012 - 10:53

es un algoritmo bastante interesante... y una utilizad que tal pueda tener es la de que las busquedas en base de datos sea mas rapida sobre todo cuando tiene muchos elementos

Hola HotaruV,
Pues si QuickSort es un algoritmo bastante interesante y puede ser muy rápido. Es en muchos lenguajes de programación el algoritmo por defecto de ordenación, al menos de hasta las versiones de los lenguajes que han salido en 2010.
Pero es fundamental también recalcar el hecho de que si bien QuickSort es un algoritmo que trabaja estupendamente, no es estable. Cuando los elementos están altamente, o mejor dicho totalmente, desordenados puede derivar en el peor caso e igualar en tiempos a Burbuja o BubbleSort.
Ahora hay que ver como se defenderá desde el surgimiento de TimSort. Un algoritmo que es mucho más rápido que éste... tan rápido que en el peor caso es asintóticamente igual a Quickort. Ya algunos lenguajes empezaron a ofrecerlo como predeterminado.  ;)

En lo que si quisiera hacer mencionar es que los motores de base de datos, al menos los motores SQL, no utilizan QuickSort. Tienen otros mecanismos... ya que su estructura de datos es diferente. Los motores de base de datos se valen de árboles, B+ para ser exactos. Y ya de por si los datos dentro de éste árbol se almacenan en un "orden". Lo que favorece y agiliza enormemente los tiempos.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.