Versão iterativa do Quicksort

[Enunciado]  Não é difícil escrever uma versão iterativa do Quicksort: basta providenciar pilhas para armazenar os índices que delimitam cada um dos segmentos de vetor que aparecem durante a execução do algoritmo.  Assim, pilhap[0..t] armazenará os extremos inferiores dos segmentos, enquanto pilhar[0..t] armazenará os extremos superiores.

// A função rearranja o vetor v[p..r],
// com p <= r+1, de modo que ele fique em
// ordem crescente.

void quicksort_it (int v[], int p, int r)
{
   int j, *pilhap, *pilhar, t;

   pilhap = malloc ((r-p+1) * sizeof (int));
   pilhar = malloc ((r-p+1) * sizeof (int));
   pilhap[0] = p; pilhar[0] = r; t = 0; 
   
   while (t >= 0) {      
      p = pilhap[t]; r = pilhar[t]; --t;
      if (p < r) {
         j = separa (v, p, r);    
         ++t; pilhap[t] = p; pilhar[t] = j-1; 
         ++t; pilhap[t] = j+1; pilhar[t] = r; 
      }
   }
}

Como já fizemos na versão recursiva, podemos deixar de empilhar o segundo par de índices, uma vez que ele seria desempilhado logo em seguida:

   pilhap[0] = p; pilhar[0] = r; t = 0; 
   
   while (t >= 0) {      
      p = pilhap[t]; r = pilhar[t]; --t;
      while (p < r) {
         j = separa (v, p, r);    
         ++t; pilhap[t] = p; pilhar[t] = j-1; 
         p = j + 1;
      }
   }