Il fatto che il codice funzioni anche se gli indici dell'array sono sbagliati non significa che sia giusto. Se esci fuori dagli indici dell'array sporchi della memoria che non appartiene all'array, quindi potresti sovrascrivere il valore di altre variabili oppure causare un "segmentation fault" (--> crash).
Non so come funzioni per il visual basic, ma in C, Java e in tanti altri linguaggi l'indice dell'array inizia da 0 e finisce al valore N-1 (incluso). Per cui di solito i cicli si fanno in questo modo:
int i;
for (i=0; i < n; i++) {
...
}
E' vero che l'insertion sort funziona per confronti e scambi, ma la maggior parte degli algoritmi di ordinamento funziona così. Quello che hai implementato tu è un bubble sort:
#include <stdio.h>
#include <time.h>
#define LENGTH 10
void print_array(int array[], int n);
void bubblesort(int array[], int n);
int main()
{
int n = LENGTH;
int array[n];
// init random
srand(time(NULL));
int i;
for (i=0; i<n; i++) {
array[i] = rand()%100; // number in 0-99
}
printf("Initial array: ");
print_array(array, n);
bubblesort(array, n);
printf("Ordered array: ");
print_array(array, n);
}
void bubblesort(int array[], int n) {
int i;
int j;
for (i=0; i<n; i++) {
for (j=i+1; j<n; j++) {
if (array[i] > array[j]) {
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}
}
}
void print_array(int array[], int n) {
int i;
for (i=0; i<n; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
EDIT: Fra l'altro mi accorgo solo ora della riga "temp = 199999999999999"! A cosa dovrebbe servire? La condizione "if (temp>a[j])" sarà sempre vera (se l'array è composto da numeri ragionevolmente piccoli), quindi lo scambio verrà effettuato sempre, almeno alla prima iterazione del ciclo più innestato