Código [Seleccionar] 
Lo único que haces es intercambiar los valores cuando a[i-1] es mayor que a[i]Ordenación por inserción:
Código (c) [Seleccionar] 
void ord_ins(int v[], int n) {
    int i,j,x;
    for (i=1;i<n;i++) {
        x = v[i];
        j = i-1;
        while ( (j>-1) && (v[j]>x) )
            v[j+1] = v[j--];
        v[j+1] = x;
    }
}Ordenación por quicksort (mediana de 3). Teniendo en cuenta la macro UMBRAL:
Código (c) [Seleccionar] 
void ord_ins(int v[], int n) {
    int i,j,x;
    for (i=1;i<n;i++) {
        x = v[i];
        j = i-1;
        while ( (j>-1) && (v[j]>x) )
            v[j+1] = v[j--];
        v[j+1] = x;
    }
}
void intercambiar(int v[], int izq, int der) {
    int t;
    t = v[izq];
    v[izq] = v[der];
    v[der] = t;
}
void mediana3 (int v[], int izq, int der) {
    int k = (int)((izq+der)/2);
    if ( v[k] > v[der] ) intercambiar(v, k, der);
    if ( v[k] < v[izq] ) intercambiar(v, k, izq);
    if ( v[k] > v[der] ) intercambiar(v, k, der);
}
void quicksort(int v[], int n) {
    void ordenarAux(int v[], int izq, int der) {
        if ( izq+UMBRAL <= der ) {
            mediana3(v,izq,der);
            int pivote = v[izq];
            int i = izq;
            int j = der;
            do {
                do i++;
                while ( v[i] < pivote );
                do j--;
                while ( v[j] > pivote );
                intercambiar(v, i, j);
            } while (j > i);
            intercambiar(v,i,j);
            intercambiar(v,izq,j);
            ordenarAux(v,izq,j-1);
            ordenarAux(v,j+1,der);
        }
    }
    ordenarAux(v,0,n-1);
    if ( UMBRAL == 1 ) ord_ins(v,n);
}Ahí tienes dos algoritmos de ordenación en C. Los tengo a mano porque tengo que implementarlos y analizar su complejidad para una práctica en estos momentos.
Saludos.