Ayuda con QuicSort

Dudas e ideas sobre los distintos e infinitos (:-)) algoritmos existentes.
Responder
Mensaje
Autor
Avatar de Usuario
zero77
Mensajes: 19
Registrado: 10/10/2006 11:00 pm

Ayuda con QuicSort

#1 Mensaje por zero77 » 11/04/2015 5:51 pm

Hola; necesito ayuda con este codigo de ordenacion QuickSort, el codigo en si funciona, pero debe ordenar un archivo .txt de 100 Mb, pero al ejecutarse manda el siguiente error:
Violación de segmento (`core' generado)

esto se debe a que el programa se queda sin memoria y no se como solucionarlo.

Estoy usando Ubuntu 14.10

Adjunto archivo que debe ordenar

https://www.dropbox.com/s/udgr6w5v35j34 ... t.zip?dl=0


#include<stdio.h>
#include<stdlib.h>

#define ARCHIVO_ENT "EntradaC.txt"
#define ARCHIVO_SAL "SalidaQS_DD_C.txt"
#define ARCHIVO_SAL_PD "/Home/eduardo/Escitorio/SalidaQS_PD_C.txt"
#define NUM_ELEM 21257764 // 10000

int partition(double arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];

while (i <= j) {
while (arr < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr;
arr = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
return i;
}

void quickSort(double arr[], int left, int right) {
int index = partition(arr, left, right);
if (left < index - 1)
quickSort(arr, left, index - 1);
if (index < right)
quickSort(arr, index, right);
}

int main(void)
{
double arr[NUM_ELEM];
int i;
double n;

FILE *entrada;
entrada = fopen (ARCHIVO_ENT, "r" );
for(i = 0; i<NUM_ELEM; i++){
fscanf(entrada,"%lf",&n);
arr = n;
}
fclose (entrada);
quickSort(arr,0,9999);

//Salida para disco
FILE *salida;
salida = fopen(ARCHIVO_SAL, "w");
for(i = 0; i<NUM_ELEM; i++){
fprintf(salida, "%lf\n", arr);

}
fclose (salida);
/*
//Salida para pendrive
FILE *salidaPD;
salidaPD = fopen(ARCHIVO_SAL_PD, "w");
for(i = 0; i<NUM_ELEM; i++){
fprintf(salidaPD, "%lf\n", arr);
}
fclose (salidaPD);
*/
return 0;
}


    Avatar de Usuario
    cheroky
    Mensajes: 2571
    Registrado: 22/09/2005 11:00 pm
    Ubicación: Valladolid (España)

    #2 Mensaje por cheroky » 11/04/2015 11:42 pm

    Hola.

    No he revisado el fuente pero lo primero que se aprecia en base a los síntomas que comentas es la cantidad (número) de elementos del array, es excesivo. La pila del programa 'revienta'.

    Para solucionarlo reserva memoria del heap mediante la función malloc

    PD: Las llamadas recursivas también devoran espacio en la pila, desconozco si en este caso particular ello es un problema, ya nos contarás.



    ∙∃0ƒ∙
    Imagen

    Avatar de Usuario
    zero77
    Mensajes: 19
    Registrado: 10/10/2006 11:00 pm

    #3 Mensaje por zero77 » 12/04/2015 8:22 am

    reserve memoria en el main, al terminar de declarar las variables.

    arr=(double*)malloc(NUM_ELEM*sizeof(double));

    pero envia multiples errores.

    Avatar de Usuario
    cheroky
    Mensajes: 2571
    Registrado: 22/09/2005 11:00 pm
    Ubicación: Valladolid (España)

    #4 Mensaje por cheroky » 12/04/2015 10:15 am

    Es lo que tienen los compiladores, que envian errores :)

    Tú dirás cuales.

    ∙∃0ƒ∙
    Imagen

    kunicksmag
    Mensajes: 4
    Registrado: 15/08/2019 6:51 am

    Ayuda con QuicSort

    #5 Mensaje por kunicksmag » 27/08/2019 1:40 am

    Depende de lo que instales lo que tendrás de memoria por ahí leí que las XO-15 tiene unos 4Gb libres para el uso
    Pero no es tanta la memoria que se gasta.
    ¿Que computador tienes tú?

    Responder

    ¿Quién está conectado?

    Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados