Ordenação por Inserção

From Wiki**3

Ordenação de Vectores

Exemplo de preenchimento.

 void init() {
   int i;
   vect = (int *)malloc(N * sizeof(int));
   for (i=0; i < N; i++)
     vect[i] =  rand() % M;
 }

Implementação do algoritmo.

 void isort() {
   int i, j;
   for (i=1; i < N; i++) {
     int key = vect[i];
     j = i-1;
     while (j >= 0 && vect[j] > key) {
       vect[j+1] = vect[j];
       j--;
     }
     vect[j+1] = key;
   }
 }

Ordenação de Listas Simplesmente Ligadas

Apresentam-se duas versões do algoritmo de ordenação por inserção para listas simplesmente ligadas: com e sem sentinela.

Sem sentinela

 void isort() {
   link pa, pb, px, py, pz;
 
   for (px = head->next, py = head; px != NULL; px = pz) {
     py->next = px->next;
     pz = px->next;
 
     for (pb=head, pa=pb; pb!=pz; pa=pb, pb=pb->next) {
       if (pb->item > px->item)
         break;
     }
     if (pa == pb) { head = px; }
     else          { pa->next = px; }
     px->next = pb;
     if (pb == pz) { py = px; }
   }
 }

Com Sentinela

Criação e inicialização da lista.

 void init() {
   int i;
   link t, u, a;
   heada = (link)malloc(sizeof *heada);
   headb = (link)malloc(sizeof *headb);
   a = heada;
   for (i = 0, t = a; i < N; i++) {
     t->next = malloc(sizeof *t); 
     t = t->next; t->next = NULL;
     t->item = rand() % M; 
   }
 }

Algoritmo de ordenação.

 void isort() {
   link t, u, x, b;
 
   b = headb; b->next = NULL;
   for (t = heada->next; t != NULL; t = u) {
     u = t->next;
     for (x = b; x->next != NULL; x = x->next)
       if (x->next->item > t->item) break;
     t->next = x->next; x->next = t; 
   }
   heada->next = headb->next;
   headb->next = NULL;
 }