Strano loop durante algoritmo quicksort

di il
4 risposte

Strano loop durante algoritmo quicksort

Salve, è la prima volta che scrivo in questo forum, piacere di conoscervi. Sto imparando il C++, provengo già da una base di Basic e Pascal, e sto procedendo seguendo il manuale Deitel&Deitel. Sto provando a fare un esercizio sull'algoritmo quicksort. Il punto è che con l'algoritmo va tutto bene, ma un passo ricorsivo mi sta mandando ai matti perché manda il programma in loop e in crash (presumo per uno stack overflow). Vi metto il codice, la funzione quicksort è in fondo. Ho fatto tutte le varie prove di esclusione e ho trovato che la chiamata a funzione, alla fine del codice, crea il loop, la variabile "i" resta sempre 6 durante tutto il programma, sebbene venga incrementata (ho fatto varie prove con cout per determinare dove fosse il loop). Vi ringrazio molto.
//Programma esercizio 8.24
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

void quickSort( int [], int, int );

int main()
{
  int nArray[10] = {37, 2, 6, 4, 89, 8, 10, 12, 68, 45};
  
  //cout <<"Inserire dieci valori da ordinare:\n\n";
  //for ( int i = 0; i < 10; i++ )
  //{
    //cout <<"Inserire valore " << i + 1 <<": ";
    //cin >> nArray[i]; 
    //cout <<"\n\n";  
  //}
  
  quickSort( nArray, 0, 9 );
  
  cout <<"Ecco i valori ordinati:\n";
  for ( int y = 0; y < 10; y++ )
    cout << nArray[y] <<" ";
  
  cout << endl << endl;
    
  system ("pause");
  return 0;
}


void quickSort( int v[], int a, int b ) //funzione quicksort, riceve array e indici
{
 if ( a == b ) 
  return;
 
 int i = a;
 int j = b;
 int hold;
 
 while ( i != j )
 {
  while ( ( v[i] < v[j] ) && ( i < j ) )
   j--;
   
   if ( i != j )
   {
    hold = v[i];
    v[i] = v[j];
    v[j] = hold;
    i++;
   }

  
  while ( ( v[j] > v[i] ) && ( i < j ) )
   i++;
   
   if ( i != j )
   {
    hold = v[j];
    v[j] = v[i];
    v[i] = hold;
    j--;
   }
 }
  quickSort( v, a, i-- );
  quickSort( v, i++, b );//questo pezzo manda in loop il programma!
}

4 Risposte

  • Re: Strano loop durante algoritmo quicksort

    Loop e qiucksort stanno come cavoli e cavalli
  • Re: Strano loop durante algoritmo quicksort

    migliorabile ha scritto:


    loop e qiucksort stanno come cavoli e cavalli
    Opinione interessante... anche se non ho capito.
    Il problema è che la variabile i dovrebbe essere incrementata a 7 quando entra in quickSort(v, i++, b), invece resta fissa a 6. Mi aspettavo un loop con i diverso da 6 (infatti nessuna condizione di uscita che ho provato aiuta).
  • Re: Strano loop durante algoritmo quicksort

    Pare che ho risolto, ma in un modo che non mi riesco a spiegare. Ho effettuato un debug e ho notato che c'era un problema con i-- e i++ nelle chiamate (praticamente non venivano incrementate e decrementate nel modo giusto, ma perdevano o aggiungevano 1)
    quickSort( v, a, i-- );
    quickSort( v, i++, b );
    allora ho sostituito con
    quickSort( v, a, i - 1 );
    quickSort( v, i + 1, b );
    e funziona.
    Qualcuno mi sa spiegare? per me "i + 1" e "i++" sono equivalenti, ma sono inesperto e probabilmente qualcosa mi sfugge.

    Ho anche dovuto sostituire
    if ( a == b ) 
      return;
    con a >= b, ma questo per evitare un loop (questo previsto però)
  • Re: Strano loop durante algoritmo quicksort

    Attenzione, una cosa i++ e i+1 sono la stessa cosa solo in alcuni casi.
    L'operatore i++ è l'operatore di post-incremento. Ciò significa che prima viene "restituito" il valore di i, poi i viene incrementato. Il codice
    funzione(i++)
    equivale a
    funzione(i); 
    i = i+1
    .
    Per incrementare il valore prima di utilizzarlo, puoi usare l'operatore di pre-incremento ++i :
    funzione(++i);
Devi accedere o registrarti per scrivere nel forum
4 risposte