Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C] algoritmo counting sort

    Ciao a tutti...stavo provando a capire un pò l'algoritmo del counting sort...e inizialmente avevo imparato a farlo manualmente, adesso stavo provando ad implementarlo (uso devC++ su winXP)...posto il codice così si capisce meglio...
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int* read_seq ( int* seq, int* dim );
    int search_max ( int* seq, int dim );
    int end ( int* v, int max );
    
    int main ()
    {
        int *seq;
        int *vR, *vS;
        int i, j, k;
        int dim=0, max;
        
        seq = read_seq ( seq, &dim );   
        
        max = search_max ( seq, dim );
        
        vR = (int*)malloc((max)*sizeof(int));  //allocazione vettore ricorrenze//
        vS = (int*)malloc((max)*sizeof(int));  //allocazione vettore somma//
    
        for ( k=0; k<max; k++ ) {
            vR[k]=0;
            vS[k]=0;
        }
        
        for ( k=0; k<max; k++ ) {
            for ( j=1; j<=dim; j++ ) {
                if ( seq[j] == k ) {
                    vR[k]++;
                }
            }
        }
    
        vS[0] = vR[0];
        for ( k=1; k<max; k++ ) {
            vS[k] = vS[k-1] + vR[k];
        }
        
        j=k=0;
        do {
            for ( k=0; k<max; k++ ) {
                if ( vS[k]!=0 && vR[k]!=0 ) {
                   i = vS[k];
                   seq[i] = k;    
                   vS[k]--;
                   vR[k]--;
                } 
            }
        } while ( end( vR, max ) == 1 );
        
        //stampa vettore ordinato//
        for ( k=1; k<=dim; k++ ) {
            printf ("%3d", seq[k]);
        }
        printf ("\n");
        
        free(seq);
        free(vS);
        free(vR);
        
        system("pause");
        return(1);
    }
    int* read_seq ( int* seq, int* dim ) 
    {
        int i, k;
        FILE *aptr;
    
        aptr = fopen ("sequenza.txt","r");
        
        if ( aptr == NULL ) {
             printf ("Errore apertura file\n");
             exit(1);
        }
        while ( fscanf(aptr,"%d", &k) != EOF ) {
              (*dim)++;
        }
        seq = (int*)malloc((*dim)*sizeof(int));
        if ( seq == NULL ) {
             printf ("Errore di allocazione\n");
             exit(1);
        }
        rewind(aptr);
        i=1;
        while ( fscanf(aptr,"%d", &seq[i]) != EOF && i<=(*dim) ) {
              i++;
        }
        fclose(aptr);
        return (seq);
    }
    int search_max ( int* seq, int dim )
    {
         int i, max;
         
         max = seq[1];
         for ( i=1; i<=dim; i++ ) {
            if ( max < seq[i] ) {
                max = seq[i];
            }
         }
         return(max+1);
    }
    int end ( int* v, int max )
    {
        int i;
        int r=0;
    
        for ( i=0; i<max; i++ ) {
            if ( v[i] == 0 ) {
               r++;
            }
        }
        if ( r == max ) {
            return(-1);
        }
        else return 1;
    }
    ecco..questo è quello che ho provato a scrivere...però...inizialmente funzionava...poi ad un tratto ho provato a cambiare sequenza nel fine "sequenza.txt" e ad un tratto non legge più!! ovvero la riga:
    codice:
    while ( fscanf(aptr,"%d", &k) != EOF ) {
              (*dim)++;
        }
    non so perchè, ma clicla all'infinito...eppure non ho cambiato niente...mah...
    comunque volevo sapere anche se come implementazione può essere considerata decente...o se è completamente inefficiente...
    grazie mille

  2. #2
    Ad un primo sguardo al codice, si direbbe un errore di indicizzazione.
    Ti ricordo che in C/C++ gli indici dei vettori iniziano dall'elemento 0,
    e non dall'elemento B]1[/B].
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ma noi abbiamo scritto volutamente in quel modo perchè altrimenti co dava problemi se nella sequenza c'era il numero zero...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.