Ordinamento "al volo" con puntatori (C++)

Giova411
Per colmare evidenti lacune mi sto rivedendo i puntatori.
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
vict85
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?

Giova411
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??

Giova411
Ho provato a mettere un numero alto poi per le sentinelle ma lo stesso non funziona....
=(

vict85
Probabilmente ci sono altri errori comunque
*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.

Giova411
Grazie Vict!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.