[C] - Bucket Sort

di il
7 risposte

[C] - Bucket Sort

Salve, vorrei un parere sul seguente esercizio:

ES: Scrivere un programma che implementi l'algoritmo di ordinamento Bucket Sort in cui un vettore casuale di M interi verrà prima sistemato in N bucket, dove N rappresenta il valore massimo presente nel vettore e successivamente scorra tali bucket per ordinare il vettore originario.

Io l'ho svolto in questo modo :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 20
#define N 100

void bucket_sort(int vettore[]);

int main()
{
	int vettore[M] = {0};

	  srand(time(NULL));
    printf("\nVETTORE CASUALE : ");

    for(int i = 0; i < M; i++)
       printf("%d ", vettore[i] = 1 + rand() % N);
    
    bucket_sort(vettore);
    
    printf("\n\nVETTORE ORDINATO : ");
    for(int i = 0; i < M; i++)
       printf("%d ", vettore[i]);

    printf("\n\n");
	return 0;
}

void bucket_sort(int vettore[])
{
	int bucket[N] = {0}, count = 0;

	for(int i = 0; i < M; i++)
    	bucket[vettore[i]]++;
    
    for(int i = 0; i < N; i++)
    {
       if(bucket[i] > 0)
       {
       	  for(int j = 0; j < bucket[i]; j++)
       	  {
       	     vettore[count] = i;
       	     count++;
       	  }
       }
    }
}
Potrebbe andare come soluzione?

Grazie

7 Risposte

  • Re: [C] - Bucket Sort

    int vettore[M] = {0};
    = {0} rallenta il codice, perché questo vettore lo sovra-scriverai totalmente e quindi è inutile inizializzarlo
    
        for(int i = 0; i < M; i++)
        	  bucket[vettore[i]]++;
        
        for(int i = 0; i < N; i++)
    
    i è meglio se la dichiari fuori se la devi usare in due for diversi
    
           if(bucket[i] > 0)
           {
           	  for(int j = 0; j < bucket[i]; j++)
    
    if(bucket[ i ] > 0) è inutile, perché se bucket[ i ] == 0 comunque esci subito dal for dopo aver inizializzato j
    
           	     vettore[count] = i;
           	     count++;
    lo puoi semplicemente scrivere come vettore[count++] = i;

    Quindi, in conclusione
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define M 20
    #define N 100
    
    void bucket_sort(int vettore[]);
    
    int main()
    {
        int vettore[M];
    
        srand(time(NULL));
    	
        printf("\nVETTORE CASUALE : ");
        for(int i = 0; i < M; i++)
           printf("%d ", vettore[i] = 1 + rand() % N);
        
        bucket_sort(vettore);
        
        printf("\n\nVETTORE ORDINATO : ");
        for(int i = 0; i < M; i++)
           printf("%d ", vettore[i]);
    
        printf("\n\n");
        return 0;
    }
    
    void bucket_sort(int vettore[])
    {
    	int i, bucket[N] = {0}, count = 0;
    	
    	for(i = 0; i < M; i++)
        		bucket[vettore[i]]++;
        
        	for(i = 0; i < N; i++)
           		for(int j = 0; j < bucket[i]; j++)
                		vettore[count++] = i;
    }
    
    Che poi, in realtà, la variabile count non serve
    
    void bucket_sort(int vettore[])
    {
    	int i, j, bucket[N] = {0};
    
    	for(i = 0; i < M; i++)
        		bucket[vettore[i]]++;
        
    	for(i = 0; i < N; i++){
            	for(j = 0; j < bucket[i]; j++)
                		vettore[j] = i;
            	vettore += j;       
        	}
    }
    
  • Re: [C] - Bucket Sort

    Weierstrass ha scritto:


    i è meglio se la dichiari fuori se la devi usare in due for diversi
    Scusa, ma non sono d'accordo, visto soprattutto che nell'altro topic gli consigliavamo l'esatto opposto.
  • Re: [C] - Bucket Sort

    Nell'altro topic ho solo precisato che sarebbe ora di accettare la cosa: l'ho usato nel mio esempio dentro il for ed era appunto una i sola.
    Ma comunque sono solo consigli che è libero di far propri oppure no. Il codice originale è corretto
  • Re: [C] - Bucket Sort

    Weierstrass ha scritto:


    Ma comunque sono solo consigli che è libero di far propri oppure no.
    Ovviamente, intendevo solo dire che secondo me andrebbe sempre privilegiata la leggibilità (riducendo al minimo la visibilità delle variabili) rispetto ad "ottimizzazioni" che (laddove siano concrete) comportano risultati molto poco rilevanti.
  • Re: [C] - Bucket Sort

    Punto di vista legittimo
  • Re: [C] - Bucket Sort

    @Weierstrass e @Nippolo grazie per i vostri consigli, quindi in definitiva se ho ben capito, "in generale" per aumentare la leggibilità del codice dovrei sempre favorire il mascheramento delle variabili (dichiarazione interna) , ma in caso di utilizzo della stessa variabile più volte è "preferibile" un'unica dichiarazione esterna.
    if(bucket[i] > 0)
           {
           	  for(int j = 0; j < bucket[i]; j++)
    @Weierstrass hai ragione, in effetti la condizione dell'if la verifico già grazie alla dimensione di bucket quindi posso ometterla, grazie.
  • Re: [C] - Bucket Sort

    @g@lil3o

    Non c'è una regola unica per tutti, come vedi. Poi probabilmente dipende anche dal campo in cui si lavora. Scegli tu

    P..s.: è ora di passare ai puntatori o a qualche algoritmo di sort più serio
Devi accedere o registrarti per scrivere nel forum
7 risposte