Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116

    [C] Ordinare un array in C e portarsi dietro l´indice

    Ciao a tutti,
    ho bisogno di ordinare un array in modo efficiente (magari usando quicksort per esempio),
    ma al tempo stesso ho bisogno di portarmi dietro l´indice della posizione di ogni elemento
    nell´array originale disordinato.

    C´é qualcuno che ha suggerimenti?
    Il codice C dsarebbe il massimo... ;-)

    HELP!


    Vi ringrazio
    ---------------------------------------------------------------
    Libera il mondo: usa linux!

    Neither MS-Word nor MS-PowerPoint attachments please: http://www.gnu.org/philosophy/no-word-attachments.html

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Cosa non sai fare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Ciao,
    grazie per avermi risposto. Quello che non so é trovare un algoritmo
    giá pronto che implementi un ordinamento che si porto dietro l´indice
    e mi sono rivolto a voi per sapere se qualcuno ha giá risolto il problema


    Aveter qualche suggerimento? Non so dove sbattere la testa ;-(
    ---------------------------------------------------------------
    Libera il mondo: usa linux!

    Neither MS-Word nor MS-PowerPoint attachments please: http://www.gnu.org/philosophy/no-word-attachments.html

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Non esiste un "algoritmo" particolare ...

    Usa un normale ordinamento e man mano che ordini gli elementi, memorizzi i valori degli indici originali in un vettore parallelo ...

    Prova a scrivere il codice che ordina i dati e poi si passa ad esaminare il problema degli indici ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Ciao,
    grazie per la risposta.
    Non posso fare cosí perché deve essere altamente efficiente l´ordinamento.

    Hai percaso qualche altra idea?

    Grazie
    ---------------------------------------------------------------
    Libera il mondo: usa linux!

    Neither MS-Word nor MS-PowerPoint attachments please: http://www.gnu.org/philosophy/no-word-attachments.html

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Che vuol dire?

    Usa un quick-sort e quando scambi gli elementi, scambi anche quelli del vettore parallelo degli indici originali.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    ciao,
    credo che la soluzione migliore (ora provo) sia definire una struct con 2 campi: l´indice e l´elemento dell´array.
    Poi si usa qsort definendo l´ oppportuna funzione di confronto.

    Ciao!
    ---------------------------------------------------------------
    Libera il mondo: usa linux!

    Neither MS-Word nor MS-PowerPoint attachments please: http://www.gnu.org/philosophy/no-word-attachments.html

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da frodo_jedi
    credo che la soluzione migliore (ora provo) sia definire una struct con 2 campi: l´indice e l´elemento dell´array.
    Poi si usa qsort definendo l´ oppportuna funzione di confronto.
    Piu' che altro credi che sia meglio seguire l'indicazione di Marco in

    http://www.p2pforum.it/forum/showthread.php?t=375584

    che condivido, anche se il vettore parallelo e' praticamente la stessa cosa ...

    Detto questo, qualsiasi strada tu segua, come ti ho gia' detto, scrivi il codice per l'ordinamento e parti da quello ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Ciao,
    ho provato a fare come mi ha suggerito Marco in quell´altro forum ma deve esserci un problema nella comparison function del qsort.

    Potresti dare un occhi a questo semplice programma per favore?
    Voglio ordinare un array di t_amplitude_index, un nuovo tipo che ha un float (l'elemento che voglio ordinare) e un int (l' indice che va preservato).

    Non capisco cosa sbaglio ;-(

    Help!


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    
    typedef struct _amplitude_index{ // Struct to store and order the values of the amplitudes preserving the index in the original array
        float amplitude;
        int index;
    } t_amplitude_index;
    
    int compare_structs (const void *a, const void *b);
       
    
    
    
    int main (int argc, const char * argv[]) {
    
        int length_array_range = 10;
        t_amplitude_index *array_amplitudes;
        array_amplitudes = (t_amplitude_index *) malloc(sizeof(t_amplitude_index) * length_array_range);
       
        int i;
        for(i = 0; i< length_array_range;i++){
            array_amplitudes[i].amplitude = (float)i;
            array_amplitudes[i].index = i;
        }
       
        for(i = 0; i< length_array_range;i++){
        printf("array_amplitudes[i].amplitude = %f, array_amplitudes[i].index = %d\n",array_amplitudes[i].amplitude,array_amplitudes[i].index);
        }
       
       
        qsort(array_amplitudes, length_array_range, sizeof(t_amplitude_index *), (void *)compare_structs);
       
        printf("\n\n");
        for(i = 0; i< length_array_range;i++){
            printf("array_amplitudes[i].amplitude = %f, array_amplitudes[i].index = %d\n",array_amplitudes[i].amplitude,array_amplitudes[i].index);
        }
       
        free(array_amplitudes);
       
        return 0;
    }
    
    
    
    int compare_structs (const void *a, const void *b){
       
        t_amplitude_index *struct_a = (t_amplitude_index *) a;
        t_amplitude_index *struct_b = (t_amplitude_index *) b;
    
        //return (int)(struct_a->amplitude > struct_b->amplitude) - (struct_a->amplitude < struct_b->amplitude);// ascending order   
        //return (int)(struct_a->amplitude < struct_b->amplitude) - (struct_a->amplitude > struct_b->amplitude);// descending order   
    
         if(struct_a->amplitude < struct_b->amplitude) return 1;
         if(struct_a->amplitude == struct_b->amplitude) return 0;
         if(struct_a->amplitude > struct_b->amplitude) return -1;
         
    }
    ---------------------------------------------------------------
    Libera il mondo: usa linux!

    Neither MS-Word nor MS-PowerPoint attachments please: http://www.gnu.org/philosophy/no-word-attachments.html

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    116
    Ho capito!
    Avevo fatto degli errori nell´uso di qsort (sizeof e void):

    ecco il codice funzionante:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    
    typedef struct _amplitude_index{ // Struct to store and order the values of the amplitudes preserving the index in the original array
    	float amplitude;
    	int index;
    } t_amplitude_index;
    
    int compare_structs (const void *a, const void *b);
    	
    
    
    
    int main (int argc, const char * argv[]) {
    
    	int length_array_range = 10;
    	t_amplitude_index *array_amplitudes;
    	array_amplitudes = (t_amplitude_index *) malloc(sizeof(t_amplitude_index) * length_array_range);
    	
    	int i;
    	for(i = 0; i< length_array_range;i++){
    		array_amplitudes[i].amplitude = (float)i;
    		array_amplitudes[i].index = i;
    	}
    	
    	for(i = 0; i< length_array_range;i++){
    	printf("array_amplitudes[i].amplitude = %f, array_amplitudes[i].index = %d\n",array_amplitudes[i].amplitude,array_amplitudes[i].index);
    	}
    	
    	
    	qsort(array_amplitudes, length_array_range, sizeof(array_amplitudes[0]), compare_structs);
    	
    	printf("\n\n");
    	for(i = 0; i< length_array_range;i++){
    		printf("array_amplitudes[i].amplitude = %f, array_amplitudes[i].index = %d\n",array_amplitudes[i].amplitude,array_amplitudes[i].index);
    	}
    	
    	free(array_amplitudes);
    	
        return 0;
    }
    
    int compare_structs(const void *a, const void *b){
    	
        t_amplitude_index *struct_a = (t_amplitude_index *) a;
        t_amplitude_index *struct_b = (t_amplitude_index *) b;
    	
        if (struct_a->amplitude < struct_b->amplitude) return 1;
        else if (struct_a->amplitude == struct_b->amplitude) return 0;
        else return -1;
    	
    }
    ---------------------------------------------------------------
    Libera il mondo: usa linux!

    Neither MS-Word nor MS-PowerPoint attachments please: http://www.gnu.org/philosophy/no-word-attachments.html

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 © 2024 vBulletin Solutions, Inc. All rights reserved.