Ordinamento "al volo" con puntatori (C++)
Per colmare evidenti lacune mi sto rivedendo i puntatori.
Non riesco a correggere il seguente merge che ordina con array di puntatori ad int...
grazie come sempre!
Non riesco a correggere il seguente merge che ordina con array di puntatori ad int...
#include <iostream> #include <limits> using namespace std; void stampa (int *n) { int i; for (i = 0; i < 10; i++) { cout << n[i] << " "; } cout << endl; return; } void stampa2 (int** n) { int i; for (i = 0; i < 10; i++) { cout << *n[i] << " "; } cout << endl; return; } void merge (int** a, int p, int q, int r) { int n1, n2; n1 = q - p + 1; n2 = r - q; int* L[n1]; int* R[n2]; for (int i = 0; i < n1; i++) L[i] = a[p + i]; *L[n1] = numeric_limits < int >::max (); for (int j = 0; j < n2; j++) R[j] = a[q + j + 1]; *R[n2] = *L[n1]; int i = 0; int j = 0; for (int k=p; k<=r; k++) { if (*L[i] <= *R[j]) a[k] = L[i++]; else a[k] = R[j++]; } } void ordina_mergesort (int** a, int p, int r) { int q=0; if (p < r) { q = (p + r) / 2; ordina_mergesort (a, p, q); ordina_mergesort (a, q+1, r); merge (a, p, q, r); } } int main () { int scombinati[] = { 9, 1, 8, 2, 0, 3, 7, 4, 6, 5 }; int **ordinati; ordinati = new int *[10]; for(int i=0; i<10; i++) ordinati[i] = scombinati+i; ordina_mergesort(ordinati, 0, 9); cout << "Stampo i numeri scombinati: (9, 1, 8, 2, 0, 3, 7, 4, 6, 5)" << endl; stampa (scombinati); cout << "\nStampo i numeri ordinati: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)" << endl; stampa2 (ordinati); delete [] ordinati; return 0; }
grazie come sempre!
Risposte
Nel merge stai usando dei variadic length array. Questi ultimi sono stai introdotti nel C99 e GCC li ha come estensione da vari anni anche per il C++ ma non sono standard C++ e dubito diventeranno mai standard nel C++. Questo in particolare significa che se io provo a compilare con visual studio il tuo codice mi dia un errore.
A parte questo non comprendo il senso di quello che stai facendo. Perché stai riordinando un array di puntatori invece di quello di partenza?
A parte questo non comprendo il senso di quello che stai facendo. Perché stai riordinando un array di puntatori invece di quello di partenza?
Vict!!!! =) Menomale hai scritto!!!
Volevo esercitarmi coi puntatori ed ordinare in modo indiretto.
Ci sono riuscito col quick, bubble etc. Col Merge niente da fare....
Come faccio allora a fissare le sentinelle??
Volevo esercitarmi coi puntatori ed ordinare in modo indiretto.
Ci sono riuscito col quick, bubble etc. Col Merge niente da fare....
Come faccio allora a fissare le sentinelle??
Ho provato a mettere un numero alto poi per le sentinelle ma lo stesso non funziona....
=(
=(
Probabilmente ci sono altri errori comunque
dove L è definita come un VLA di n1 elementi è sbagliato: stai lavorando fuori dall'array. Inoltre L[n1] è un puntatore non inizializzato.
*L[n1] = numeric_limits < int >::max ();
dove L è definita come un VLA di n1 elementi è sbagliato: stai lavorando fuori dall'array. Inoltre L[n1] è un puntatore non inizializzato.
Grazie Vict!