[Pillola][Tutorial] Principali algoritmi di ordinamento in c++ - Pag 2
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Pag 2 di 2 PrimoPrimo 12
Visualizzazione risultati da 16 a 18 di 18

Discussione: [Pillola][Tutorial] Principali algoritmi di ordinamento in c++

Cambio titolo
  1. #16
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    Intanto posso postare un paio di algoritmi anche io:

    Bubblesort
    Codice:
    void bubblesort (int *vett,int len) 
    {
    	for (int i=len;i>0;i--) 
                   {
    		for (int j=1;j<i;j++) 
                            {
    			if (vett[j]<vett[j-1]) 
                                    swap(&vett[j],&vett[j-1]);
    		}
    	}
    }
    Bubblesort Modificato
    Codice:
    void bubblesort (int *vett,int len) 
    {
            int scambiati=0;
    	for (int i=len;i>0;i--) 
                   {
    		for (int j=1;j<i;j++) 
                            {
    			if (vett[j]<vett[j-1]) 
                                   {
                                    swap(&vett[j],&vett[j-1]);
                                    scambiati=1;
                             }
    		}
                     if (scambiati==0)
                             break;
    	}
    }
    PS: il bubblesort modificato non l'ho provato... ditemi se va..


    PPS: lo swap &#232; una banalissima funzione che scambia il contenuto delle variabili.


    Spiegazione veloce del bubblesort..
    Ho postato due versioni.
    La prima &#232; il classico bubblesort.
    Ha prestazioni di O(n^2) in tutti i casi.
    Cosa fa il bubblesort? ad ogni scorrimento dell'array l'elemento pi&#249; "pesante" (pi&#249; grande) arriva in fondo.
    Questo lavoro lo fa n volte, dove n &#232; la dimensione dell'array.

    Il bubblesort modificato invece introducendo una semplice variabile usata come booleana si interrompe quando l'array &#232; ordinato.
    Quest'accorgimento permette di migliorare le prestazioni che nel caso migliore (array gi&#224; ordinato) arrivano a O(n)
    Ultima modifica di Slimmy; 15-09-2006 alle 20:03:51

  2. #17
    Bannato L'avatar di Eclipse
    Registrato il
    02-04
    Località
    C++atania
    Messaggi
    5.604
    grazie slimmy, ecco heapsort e quicksort, ho anche messo la funzione swap che può essere usata col tuo.. appena ho tempo spiego per bene il tutto


    Codice:
    ///////// HEAPSORT /////////////////////////
    void heapify ( int* A , int newnode )
    {
      int done=0, dad, temp;
      dad = ( newnode - 1 ) / 2;
    
      while( dad >= 0 && !done)
      {
        if(A[newnode] > A[dad])
         {
           temp = A[newnode];
           A[newnode]=A[dad];
           A[dad]=temp;
           newnode = dad;
           dad = dad/2;
         }
         else
         done = 1;
    
      }
    }
    
    void heapsort ( int* A, int last )
    {
       int i,temp;
       while(last > 0 )
       {
       temp = A[0];
       A[0]=A[last];
       A[last]= temp;
       for(i=0;i<last;i++) heapify(A,i);
       last--;
       }
    }
    ////////////////////////////////////////////////////////////
    Codice:
    ///////// QUICKSORT ////////////////////////////////////
    void swap (int& a, int& b) {
    int temp = 0;
    	temp = a;
    	a = b;
    	b = temp;
    };
    
    void quicksort (int* A, int left, int right) {
    int i = 0, j = 0, pivot = 0;
    
            i = left;
            j = right;
            pivot = A[(left + right) / 2];
            do {
    	        while (A[i] < pivot)
    		        i++;
                    while (A[j] > pivot )  j--;             
                    if (i <= j) {            
    		        swap (A[i], A[j]);
    	                i++;
    	                j--; 
    	              };
            }
            while  (!(i > j)); 
            if (left < j)  // Se 'left' è minore di 'j' allora
                    quicksort(A, left, j); 
            if (i < right) // Se 'i' è minore di 'right' allora
                    quicksort(A, i, right);
    };
    ////////////////////////////////////////////////////////////
    per usare l'heapsort si deve prima chiamare heapify dalla fine all'inizio dell'array così:
    Codice:
    cout << "\n\nHeapsort\nArray di partenza:\n";
       for (c=0; c<SIZE; c++) {A[c]=array[c]; cout<<A[c]; cout<<" ";}
       for(c=0;c<SIZE;c++) heapify(A,c);
       cout << "\nHeap:\n";
       for (c=0; c<SIZE; c++) {cout<<A[c]; cout<<" ";}
       heapsort(A, SIZE-1);
       cout << "\nArray ordinato:\n";
       for (c=0; c<SIZE; c++) {cout<<A[c]; cout<<" ";}
    questo invece per il quicksort

    Codice:
    cout << "\n\nQuicksort\nArray di partenza:\n";
       for (c=0; c<SIZE; c++) {A[c]=array[c]; cout<<A[c]; cout<<" ";}
       quicksort(A, 0,SIZE-1);
       cout << "\nArray ordinato:\n";
       for (c=0; c<SIZE; c++) {cout<<A[c]; cout<<" ";}

  3. #18
    developing... L'avatar di Slimmy
    Registrato il
    07-03
    Località
    NSApplication
    Messaggi
    6.417
    Aggiunto il commento al bubblesort.

    Una cosa eclipse..
    La tua versione di swap &#232; per c++ perch&#232; usi i reference.
    Posto la versione con i puntatori utilizzabile in C ( e nella mia versione di bubblesort!)

    Codice:
    void swap(int *a, int *b) 
    {
    	int temp=*a;
    	*a=*b;
    	*b=temp;
    }

Pag 2 di 2 PrimoPrimo 12

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •