PDF de programación - Algoritmos de ordenación - Implementación en C

Imágen de pdf Algoritmos de ordenación - Implementación en C

Algoritmos de ordenación - Implementación en Cgráfica de visualizaciones

Publicado el 6 de Julio del 2020
771 visualizaciones desde el 6 de Julio del 2020
101,4 KB
5 paginas
Creado hace 21a (08/02/2003)
Algoritmos de ordenación - Implementación



Selección
int array[N];
int i,j,menor,aux;

// Dar valores a los elementos del array

for(i=0;i<N-1;i++)
{
for(j=i+1,menor=i;j<N;j++)
if(array[j]<array[menor]) // Si el elemento j es menor que el menor:
menor=j; // el menor pasa a ser el elemento j.
aux=array[i]; // Se intercambian los elementos
array[i]=array[menor]; // de las posiciones i y menor
array[menor]=aux; // usando una variable auxiliar.
}

Burbuja
int array[N];
int i,j,aux;

// Dar valores a los elementos del array

for(i=0;i<N-1;i++) // Hacer N-1 pasadas.
for(j=0;j<N-i-1;j++) // Mirar los N-i-1 pares.
if(array[j+1]<array[j]) // Si el elemento j+1 es menor que el
elemento j:
{
aux=array[j+1]; // Se intercambian los elementos
array[j+1]=array[j]; // de las posiciones j y j+1
array[j]=aux; // usando una variable auxiliar.
}

Inserción directa
int array[N];
int i,j,aux;

// Dar valores a los elementos del array

for(i=1;i<N;i++) // i contiene el número de elementos de la sublista.
{ // Se intenta añadir el elemento i.
aux=array[i];
for(j=i-1;j>=0;j--) // Se recorre la sublista de atrás a adelante para
buscar
{ // la nueva posición del elemento i.
if(aux>array[j]) // Si se encuentra la posición:
{

array[j+1]=aux; // Ponerlo
break; // y colocar el siguiente número.
}
else // si no, sigue buscándola.
array[j+1]=array[j];
}
if(j==-1) // si se ha mirado todas las posiciones y no se ha
encontrado la correcta
array[0]=aux; // es que la posición es al principio del todo.
}

Shell
int array[N];
int salto,cambios,aux,i;

for(salto=N/2;salto!=0;salto/=2) // El salto va desde N/2 hasta 1.
for(cambios=1;cambios!=0;) // Mientras se intercambie algún elemento:
{
cambios=0;
for(i=salto;i<N;i++) // se da una pasada
if(array[i-salto]>array[i]) // y si están desordenados
{
aux=array[i]; // se reordenan
array[i]=array[i-salto];
array[i-salto]=aux;
cambios++; // y se cuenta como cambio.
}
}

Intercalación
int i1,i2,is;
int array1[N1],array2[N2],suma[N1+N2];

for(i1=i2=is=0;i1<N1 && i2<N2;is++) // Mientras no se me acabe ni array1
ni array2:
{
if(array1[i1]<array2[i2]) // Si el elemento de array1 es menor:
{
suma[is]=array1[i1]; // se utiliza el de array1.
i1++;
}
else // Pero si el elemento de array2 es menor:
{
suma[is]=array2[i2]; // se utiliza el de array2.
i2++;
}
}
for(;i1<N1;i1++,is++) // Añadir los elementos de array1 (si quedan).
suma[is]=array1[i1];
for(;i2<N2;i2++,is++) // Añadir los elementos de array2 (si quedan).
suma[is]=array2[i2];

El algoritmo de intercalación es usado conjuntamente con la técnica de búsqueda
divide y vencerás para implementar el mergesort.

//solo hay un elemento, así que finaliza

//divide

//combina



if (low==high)

return;

Mergesort
void mergesort(int a[],int low,int high)
{



}

int length = high-low+1;
int pivot = (low+high)/2;


mergesort(a,low,pivot);
mergesort(a,pivot+1,high);


int working[] = new int [length];
for (int i=0;i<length;i++)

working[i]=a[low+i];
int m1=0;
int m2=pivot-low+1;
for(int i=0; i<length; i++)
{



}

if(m2 <= high-low)



else


if(m1 <= pivot -low)



else

a[i+low]=working[m1++];

if(working[m1] >working[m2])

else

a[i+low]=working[m2++];

a[i+low] = working[m2++];
a[i+low] = working[m1++];

Quicksort

La implementación es claramente recursiva, y suponiendo el pivote el primer elemento
del array, el programa sería:

#include<stdio.h>

void ordenar(int *,int,int);

void main()
{
// Dar valores al array
ordenar(array,0,N-1); // Para llamar a la función
}

void ordenar(int *array,int desde,int hasta)

{
int i,d,aux; // i realiza la búsqueda de izquierda a derecha
// y j realiza la búsqueda de derecha a izquierda.
if(desde>=hasta)
return;

for(i=desde+1,d=hasta;;) // Valores iniciales de la búsqueda.
{
for(;i<=hasta && array[i]<=array[desde];i++); // Primera búsqueda
for(;d>=0 && array[d]>=array[desde];d--); // segunda búsqueda
if(i<d) // si no se han cruzado:
{
aux=array[i]; // Intercambiar.
array[i]=array[d];
array[d]=aux;
}
else // si se han cruzado:
break; // salir del bucle.
}
if(d==desde-1) // Si la segunda búsqueda se sale del array
d=desde; // es que el pivote es el elemento
// más pequeño: se cambia con él mismo.
aux=array[d]; // Colocar el pivote
array[d]=array[desde]; // en su posición.
array[desde]=aux;

ordenar(array,desde,d-1); // Ordenar el primer array.
ordenar(array,d+1,hasta); // Ordenar el segundo array.
}

En C hay una función que realiza esta ordenación sin tener que implementarla, llamada
qsort (incluida en stdlib.h):

qsort(nombre_array,numero,tamaño,función);

donde nombre_array es el nombre del array a ordenar, numero es el número de
elementos del array, tamaño indica el tamaño en bytes de cada elemento y función es
una función, que hay que implementar, que recibe dos elementos y devuelve 0 si son
iguales, algo menor que 0 si el primero es menor que el segundo, y algo mayor que 0
si el segundo es menor que el primero. Por ejemplo, el programa de antes sería:

#include<stdio.h>
#include<stdlib.h>

int funcion(const void *,const void *);

void main()
{
// Dar valores al array
qsort(array,N,sizeof(array[0]),funcion); // Ordena el array.
}

int funcion(const void *a,const void *b)
{

if(*(int *)a<*(int *)b)
return(-1);
else if(*(int *)a>*(int *)b)
return(1);
else
return(0);
}

Claramente, es mucho más cómodo usar qsort que implementar toda la función, pero
hay que tener mucho cuidado con el manejo de los punteros en la función, sobre todo
si se está trabajando con estructuras.
  • Links de descarga
http://lwp-l.com/pdf17877

Comentarios de: Algoritmos de ordenación - Implementación en C (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad