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.