Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Ordinare una lista

  1. #1

    Ordinare una lista

    Scusate ma non ne vengo fuori!!!!

    Ho una lista concatenata

    mettiamo che *testa punti sempre al primo elemento, *coda punti sempre all' ultimo elemento. All' interno di ogni nodo c'è un intero.

    *scan lo uso per scandire la lista
    *scan->next ne è il successivo

    Utilizzando un qualsisi algoritmo di ordinamento (quicksort,mergesort...) come ordino i nodi in ordine crescente?

    Grazie

  2. #2
    Non puoi usare quicksort o mergesort su di una lista , perchè non puoi accedervi in maniera casuale , ma solo sequenziale.
    Li puoi ordinare o man mano che li inserisci oppure devi usare un algoritmo lineare di ordinamento .
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  3. #3
    che algoritmo lineare ad esempio?

    grazie

  4. #4
    Potresti servirti di una seconda lista ed inserire in modo ordinato i nuovi elementi.

    Del tipo

    public void ordina(Lista p){
    Lista l=new Lista();
    Iterator it=p.getIterator();
    while(it.hasMore()){
    l.insOrdinato(it.next());
    }
    }

    dove insOrdinato è un metodo di lista che ti permette di ordinare una lista man mano che la inserisci.
    Sennò puoi inserire gli oggetti presenti nella lista in un array e ordinarlo come ti pare , successivamente ricopiare l'array in una uova lista .
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  5. #5
    Utente di HTML.it L'avatar di zaion
    Registrato dal
    Mar 2002
    Messaggi
    258
    al posto di una lista concatenata potresti usare un albero binario.
    con gli alberi quando metti dentro un elemento viene ordinato automaticamente. bello no.
    bye bye

  6. #6
    La mia non è l'unica soluzione
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  7. #7
    La mia lsta è in realtà una lista di liste e io devo ordinare i nodi in base all' intero sulla verticale:

    intero--->nodo---->nodo---->nodo
    |
    |
    intero--->nodo---->nodo---->nodo
    |
    |
    intero--->nodo---->nodo---->nodo
    |
    |
    intero--->nodo---->nodo---->nodo

    ferrmo restando che i puntatori alla lista orizzontale debban oessere mantenuti. LE soluzioni che mi avete proposto vanno ancora bene no?

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2003
    Messaggi
    20
    perchè non crei un vettore di liste e ordini il vettore normalmente ??? La lista di liste sarà anche bellina da dire ma non è proprio il massimo dell'efficienza... per accedere all'ultimo elemento dell'ultima lista ci metti un bel po' !!!
    Comunque si può adattare il quick anche ad una lista, procedendo così:
    - ti crei un vettore di puntatori(agli elementi della lista) e ci scrivi dentro gli indirizzi degli elementi della lista, così com'è, visitandola semplicemente (complessità lineare)
    - ordini il vettore di puntatori (complessità = complessità dell'algoritmo di ordinamento)
    - modifichi i puntatori della lista visitando uno ad uno gli elementi così come sono ordinati nel vettore (complessità lineare, c'è solo da modificare un paio di puntatori ogni elemento)
    Il tutto dovrebbe avere complessità O ( n + n logn + n ), quindi ok, e utilizzare n*4 bytes di memoria
    Il rovescio della medaglia è che ordinare una lista in effetti non serve a niente !!! Un qualsiasi algoritmo di ricerca non farà altro che visitare la lista da cima a fondo finchè non trova il valore cercato, la complessità è un O (n) comunque, anche se la lista è ordinata!!! L'unico vantaggio sarebbe un miglioramento nelle ricerche senza successo, che nel caso peggiore resterebbe comunque O (n).
    Non a caso sono stati inventati gli alberi bilanciati !!!

  9. #9
    nonostante il thread sia vecchio di più di otto anni, provo lo stesso...
    - ti crei un vettore di puntatori(agli elementi della lista) e ci scrivi dentro gli indirizzi degli elementi della lista, così com'è, visitandola semplicemente (complessità lineare)
    - ordini il vettore di puntatori (complessità = complessità dell'algoritmo di ordinamento)
    - modifichi i puntatori della lista visitando uno ad uno gli elementi così come sono ordinati nel vettore (complessità lineare, c'è solo da modificare un paio di puntatori ogni elemento)
    ho fatto senza problemi i primi due punti..ma ho dei problemi nel modificare i puntatori della lista..

    ho fatto una funzione del genere
    Codice PHP:
    void AdjustList(node* *p,char* *a){
         if (*
    != NULL){
             
    node **nxt = &((*p)->next);
             *
    = (node*) *a;
             (*
    p)->next = *nxt;
             
    AdjustList(nxt1);
         }
         return;

    una funzione che prende la lista (come puntatore di puntatore a nodo (per modificare il puntatore))
    e l'array di puntatori.. nella visita salvo il successivo corrente poi cambio l'indirizzo del nodo corrente con quello ordinato nell'array, nel successivo del nodo appena cambiato vado a mettere il successivo salvato precedentemente, per non saltare nodi, e richiamo ricorsivamente la funzione...
    l'output è un segmentation fault..cosa sbaglio?? lo scopo è puramente didattico, per prendere mano con i puntatori.
    Human Knowledge belongs to the World

  10. #10
    risolto...così..e l'ultimo valore dell'array è NULL..

    codice:
    void AdjustList(node* *p,char* *a){
         while(*a != NULL){
             node *nxt = (*p)->next;
             *p = (node*) *a;
              (*p)->next = nxt;
             p = &((*p)->next);
             a++;
         }
         *p = NULL;
         return;
     }
    Human Knowledge belongs to the World

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.