Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con eficiencia QUICKSORT

Estas en el tema de Problema con eficiencia QUICKSORT en el foro de C/C++ en Foros del Web. hola a todos, les comento que hice un ejercicio con el metodo QUICKSORT con el fin de reducir el tiempo para una lectura de entrada ...
  #1 (permalink)  
Antiguo 05/05/2010, 19:10
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años, 6 meses
Puntos: 0
Problema con eficiencia QUICKSORT

hola a todos, les comento que hice un ejercicio con el metodo QUICKSORT con el fin de reducir el tiempo para una lectura de entrada de 1000 datos enteros, el problema es que me esta arrojando mas tiempo que bubblesort cosa que no deberia ser, , alguien me puede ayudar a hacer mas optimo este algoritmo ya que por naturaleza es mas rapido que el mismo bubblesort, saludos

Código C:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<string.h>
  5.  
  6. void swap(int *a, int *b)
  7. {
  8.   int t=*a; *a=*b; *b=t;
  9. }
  10. void quicksort(int arr[], int beg, int end)
  11. {
  12.   if (end > beg + 1)
  13.   {
  14.     int piv = arr[beg], l = beg + 1, r = end;
  15.     while (l < r)
  16.     {
  17.       if (arr[l] >= piv)
  18.         l++;
  19.       else
  20.         swap(&arr[l], &arr[--r]);
  21.     }
  22.     swap(&arr[--l], &arr[beg]);
  23.     quicksort(arr, beg, l);
  24.     quicksort(arr, r, end);
  25.   }
  26. }
  27.  
  28.  
  29.  
  30. int main()
  31. {
  32.  
  33.   float total,inicio, final;
  34.   inicio=clock();
  35.   FILE *ARCH, *ARCHI;
  36.  
  37.     int N;
  38.     ARCH = fopen("aleatorio.txt","r");
  39.     fscanf(ARCH,"%i", &N);
  40.     int d[N], a;
  41.  
  42.     a=0;
  43.     for(a=0;a<N;a++)
  44.     {
  45.       fscanf(ARCH,"%i", &d[a]);
  46.     }
  47.  
  48.     ARCHI = fopen("quick_dec.txt","w");
  49.  
  50.   int length;
  51.   length=N;
  52.  
  53.   int i;
  54.   for(i=0;i<length;i++)
  55.     {
  56.       quicksort(d, 0, length);
  57.       fprintf(ARCHI,"%i \n",d[i]);
  58.     }
  59.  
  60.  
  61.   final=clock();
  62.   total=(final-inicio)/(double) CLOCKS_PER_SEC;
  63.   printf("Tiempo de ejecucion : %f [s]\n",total);
  64.  
  65.   fclose(ARCH);  
  66.   fclose(ARCHI);
  67. return 0;
  68. }
  #2 (permalink)  
Antiguo 05/05/2010, 19:59
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con eficiencia QUICKSORT

Lo primero de todo esa implementacion del Quicksort funciona?

Lo segundo no exiiste un teorema que diga que simpre y para todos los casos el tiempo de de quicksort va ser menor que el de Bubble sort.

Lo que si se pueden asegurar cotas para cada uno de ellos. Y ahi si resulta menor la cota de quicksort que la del bubblesort.

Pero cual es el problema, uno de los peores casos para el quicksort, tener la lista ordenada, para el bubble sort es el mejor ya que esta ordenado. Entonces la cantidad de intercambios que realizan es muy diferente.
Fiajte que el peor caso del quicksort es de orden n cuadrado. Osea lo mismo que un Bubblesort

Por eso te digo que te fijes bien como estan ordenados esos elementos. y que realices muchos intentos con distintos elementos para ver si anda que resultados optenes. Posiblemente tu array esta muy ordenado.
  #3 (permalink)  
Antiguo 05/05/2010, 20:05
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema con eficiencia QUICKSORT

Si la implementacion compila y arroja la lista tanto ordenada, el archivo que leo es un archivo aleatorio por ende esta desordenado quiza ese es el problema esta mas ordenado que desordenado por eso se demora tanto, pero de ser asi mergesort que tambien tengo implementado su orden es nlogn para ambos casos y aun asi tambien se demora mucho mas que bubblesort
  #4 (permalink)  
Antiguo 05/05/2010, 20:17
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con eficiencia QUICKSORT

Tambien depende mucho de las implementaciones. En la complejidad del merge-sort no se tiene en cuenta la creacion de dos array mas para poder ordenar de forma mas comodo.

Ponele una variable global que cuenta los intercambios y las comparaciones que hace el programa. En mi facu me dieron ese ejercicio para ver las diferencias.
  #5 (permalink)  
Antiguo 05/05/2010, 22:03
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problema con eficiencia QUICKSORT

Yo creo que la linea 56 de tu codigo, puesta al interior de un ciclo, hace que quicksort, en vez de ser n log n, sea n^2 log n. mucho peor que bubblesort y que el mismo quicksort, si estuviera fuera del ciclo.
  #6 (permalink)  
Antiguo 05/05/2010, 22:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con eficiencia QUICKSORT

No vi eso..... perdon eso hace desastre en el codigo....

en el primer caso sopungamos que es n log n.....para el proximo el array ya esta ordenado asi que desde la segunda hasta el fin siempre va a tarde n^2...asi que debera quedar en algo asi como un: n^3 log n

que realmente es malo.
quicksort(d, 0, length);

Código C++:
Ver original
  1. for(i=0;i<length;i++)
  2.       fprintf(ARCHI,"%i \n",d[i]);

A demas por las dudas yo solo tomaria el tiempo que tarda en correr el algoritmo, no en leer y escribit los archivos...uno nunca sabe puede ocurrir y que se demore mas justo en uno...se que son micro segundo pero todo puede pasar.
  #7 (permalink)  
Antiguo 05/05/2010, 23:07
Avatar de extremoo  
Fecha de Ingreso: abril-2009
Mensajes: 54
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Problema con eficiencia QUICKSORT

toda la razon ahora si pude ejecutar el programa con normalidad gracias a ambos por la ayuda.
  #8 (permalink)  
Antiguo 06/05/2010, 05:44
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problema con eficiencia QUICKSORT

Cita:
Iniciado por sam90 Ver Mensaje
en el primer caso sopungamos que es n log n.....para el proximo el array ya esta ordenado asi que desde la segunda hasta el fin siempre va a tarde n^2...asi que debera quedar en algo asi como un: n^3 log n
Si consideramos lo que indicas, lo que es en mi opinion correcto, es decir que la primera vez deja el arreglo ordenado y luego es el peor de los casos, entonces queda

n log n + (n-1)*n^2, i.e. esta acotado por n^3. No es tan grande como n^3 log n.

Última edición por CalgaryCorpus; 06/05/2010 a las 06:01
  #9 (permalink)  
Antiguo 06/05/2010, 05:52
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con eficiencia QUICKSORT

De todas formas en grande!

Etiquetas: eficiencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:37.