Sie sind auf Seite 1von 23

1

UNIVERSIDAD AUTNOMA DE
CHIAPAS



UNIDAD ACADEMICA:
Programacin estructurada


Titulo:
Mtodos de ordenamiento en C
(Burbuja, quicksort, shellsort y sort)

Nombre del docente:
MC. Felipe Antonio Romn Albores



Presenta:
Efran Gmez Gmez

Semestre:
2

GRUPO:
B



TUXTLA GUTIERREZ CHIAPAS A 19 de abril del 2013

2
INDICE
Tema pagina
1. Introduccin.3
2. Ordenacin por el mtodo de la burbuja.4
3. Ordenacin por el mtodo quicksort6
4. Mtodo de ordenacin shellsort8
5. Ordenacin Radix sort...10
6. Archivo fuente mtodos de ordenamiento.12
7. Archivo fuente VariablesExternas.h...13
8. Archivo fuente burbuja..14
9. Archivo fuente quick sort..15
10. Archivo fuente sort.17
11. Archivo fuente Shell sort...19
12. Conclusin22
13. Bibliografa23

ndice de imgenes
1. Salida en pantalla del men...20
2. Salida en pantalla del mtodo burbuja..21
3. Salida en pantalla del quick sort.21
4. Salida en pantalla del sort...21
5. Salida en pantalla del Shell sort.22










3
INTRODUCION
Los arreglos son un tipo de estructura que tiene un tamao definido, el
tamao de un arreglo es definido a la hora de ser declarado y no se puede
modificar una vez determinado su tamao. Un arreglo puede tener varias
dimensiones, en el caso del ordenamiento de Sort se ocupa un arreglo de una lista
declarada para poder ordenar los nmeros, este arreglo es de una sola dimensin.
En la siguiente documentacin se mostrara mas mtodos de ordenamiento
en el leguaje de programacin C, para lo cual se investigara en diferentes fuentes
de internet para as aclarar dudas o ver si va de acuerdo a nuestros ejemplos de
programas dadas.
El documento contendr los siguientes mtodos de ordenamiento:
1. Burbuja
2. Quicksort
3. Sort
4. Shell sort
Cada uno de ellos contendr un ejemplo para as dejar mas en claro estas
definiciones o temas.










4
ORDENACIN POR EL MTODO DE LA BURBUJA
Este mtodo consiste en acomodar el vector moviendo el mayor hasta la
ltima casilla comenzando desde la casilla cero del vector hasta haber acomodado
el nmero ms grande en la ltima posicin, una vez acomodado el ms grande,
prosigue a encontrar y acomodar el siguiente ms grande comparando de nuevo
los numeros desde el inicio del vector, y as sigue hasta ordenar todo los
elementos el arreglo.

Este algoritmo es muy deficiente ya que al ir comparando las casillas para
buscar el siguiente ms grande, ste vuelve a comparar las ya ordenadas. A pesar
de ser el algoritmo de ordenamiento ms deficiente que hay, ste es el ms usado
en todos los lenguajes de programacin.
Entonces:
Dado un vector a
1
, a
2
, a
3
,... a
n

1) Comparar a1 con a
2
e intercambiarlos si a
1
>a
2
(o a
1
<a
2)
2) Seguir hasta que todo se haya comparado an-1 con an
3) Repetir el proceso anterior n-1 veces</a
Algoritmo: Complejidad
for(i=0; i < n-1; i++){ T(n
2
)
for(j=0; j < n-1; j++){ T(n)
if(vec[j] > vec[j+1]){ T(1)
aux=vec[j]; T(1)
vec[j]=vec[j+1]; T(1)
vec[j+1]=aux;} T(1)
}
}
El procedimiento de la burbuja es el siguiente:
Ir comparando desde la casilla 0 numero tras nmero hasta encontrar uno
mayor, si este es realmente el mayor de todo el vector se llevar hasta la
ltima casilla, si no es as, ser reemplazado por uno mayor que l.
Este procedimiento seguir as hasta que haya ordenado todas las casillas
del vector.
Una de las deficiencias del algoritmo es que ya cuando a ordenado parte
del vector vuelve a compararlo cuando esto ya no es necesario.


5
Ejemplo:

Variables
Vector
pos 0 1 2 3 4 5 6 7
i j a[j] a[j+1] inicio 44 55 12 42 94 18 6 67
0 1 55 12 cambio 44 12 55 42 94 18 6 67
0 2 55 42 cambio 44 12 42 55 94 18 6 67
0 4 94 18 cambio 44 12 42 55 18 94 6 67
0 5 94 6 cambio 44 12 42 55 18 6 94 67
0 6 94 67 cambio 44 12 42 55 18 6 67 94
1 0 44 12 cambio 12 44 42 55 18 6 67 94
1 1 44 42 cambio 12 42 44 55 18 6 67 94
1 3 55 18 cambio 2 42 44 18 55 6 67 94
1 4 55 6 cambio 12 42 44 18 6 55 67 94
2 2 44 18 cambio 12 42 18 44 6 55 67 94
2 3 44 6 cambio 12 42 18 6 44 55 67 94
3 1 42 18 cambio 12 18 42 6 44 55 67 94
3 2 42 6 cambio 12 18 6 42 44 55 67 94
4 1 18 6 cambio 12 6 18 42 44 55 67 94
5 0 12 6 ordenado 6 12 18 42 44 55 67 94










6
ORDENACION POR EL METODO QUICKSORT

El mtodo de ordenamiento Quick Sort es actualmente el ms eficiente y
veloz de los mtodos de ordenacin interna. Es tambin conocido con el nombre
del mtodo rpido y de ordenamiento por particin, en el mundo de habla hispana.
Este mtodo es una mejora sustancial del mtodo de intercambio directo y recibe
el nombre de Quick Sort por la velocidad con que ordena los elementos del
arreglo.

Su autor C.A. Hoare lo bautiz as.
La idea central de este algoritmo consiste en los siguiente:
Se toma un elemento x de una posicin cualquiera del arreglo.
Se trata de ubicar a x en la posicin correcta del arreglo, de tal forma que todos
los elementos que se encuentran a su izquierda sean menores o iguales a x y
todos los elementos que se encuentren a su derecha sean mayores o iguales a x.

Se repiten los pasos anteriores pero ahora para los conjuntos de datos que
se encuentran a la izquierda y a la derecha de la posicin correcta de x en el
arreglo.

Ejemplo:
A: 15, 67, 08, 16, 44, 27, 12, 35
Se selecciona A[i] x=15

Primera pasada (DER-IZQ)
A [8] >= x 35 >= 15 No hay intercambio
A [7] >= x 12 >= 15 Si hay intercambio

A: 12, 67, 08, 16, 44, 27, 15,35

(IZQ-DER)
A [2] < = X 67 < = 15 Si hay intercambio

A: 12, 15, 08, 16, 44, 27, 67,35

2da. Pasada (DER-IZQ)
A [6] >= x 27 >= 15 No hay intercambio
A [5] >= x 44 >= 15 No hay intercambio
A [4] >= x 16 >= 15 No hay intercambio
A [3] >= x 08 >= 15 Si hay intercambio

A: 12, 08, 15, 16, 44, 27, 67,35




7
Como el recorrido de izquierda a derecha debera iniciarse en la misma
posicin donde se encuentra el elemento x, el proceso se termina ya que el
elemento x,
Se encuentra en la posicin correcta.

A: 12, 08, 15, 16, 44, 27, 67, 35
1er 2do Conjunto
Conjunto
16, 44, 27, 67, 35
X16

(DER-IZQ)
A[8]>=x No hay intercambio
A[7]>=x No hay intercambio
A[6]>=x No hay intercambio
A[5]>=x No hay intercambio

A: 12, 08, 15, 16, 44, 27, 67, 35
x44

(DER-IZQ)
A [8]>= x Si hay intercambio

A: 12, 08, 15, 16, 35, 27, 67, 44

(IZQ-DER)
A[6] < = x No hay intercambio
A[7] < = x Si hay intercambio
12, 08, 15, 16, 35, 27, 44, 67
12, 08, 15, 16, 35, 27, 44, 67
35, 27, 44, 67
x35

(DER-IZQ)
A[8] >= x No hay intercambio
A[7] >= x No hay intercambio
A[6] >= x Si hay intercambio
12, 08, 15, 16, 27, 35, 44, 67
12,08
x12

(DER-IZQ)
A[2]>=x Si hay intercambio

EL VECTOR ORDENADO:
08, 12, 15, 16, 27, 35, 44,67






















8

MTODO DE ORDENACIN SHELL
El mtodo Shell pertenece a los mtodos de clasificacin avanzados,
nombrado as en honor a su desarrollador, Donald Shell.
Este mtodo utiliza una segmentacin entre los datos. Funciona
comparando elementos que estn distantes; la distancia entre comparaciones
decrece conforme el algoritmo se ejecuta hasta la ltima fase, en la cual se
comparan los elementos adyacentes, por esta razn se le llama ordenacin por
disminucin de incrementos.
La ordenacin de Shell usa una secuencia, h1, h2, . . ., ht, conocida como la
secuencia de incrementos. Al principio de todo proceso, se fija una secuencia
decreciente de incrementos. Cualquier secuencia funcionar en tanto que empiece
con un incremento grande, pero menor al tamao del arreglo de los datos a
ordenar, y que el ltimo valor de dicha secuencia sea 1.
Una eleccin muy comn (pero no tan eficiente) para la secuencia de
incrementos es adoptar la secuencia sugerida por Shell: ht = [n / 2], y hk = [hk+1 /
2]. A continuacin se muestra un programa que implanta la ordenacin de Shell
usando esta secuencia.
Ordena subgrupos de elementos separados K unidades (respecto de su
posicin en el arreglo) del arreglo original. El valor K es llamado incremento.
Despus de que los primeros K subgrupos han sido ordenados
(generalmente utilizando INSERCION DIRECTA), se escoge un nuevo valor de K
ms pequeo, y el arreglo es de nuevo partido entre el nuevo conjunto de
subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se
repite de nuevo con un valor ms pequeo de K.
Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo
consiste de todo el arreglo ya casi ordenado.
Al principio del proceso se escoge la secuencia de decrecimiento de
incrementos; el ltimo valor debe ser 1.
Es como hacer un ordenamiento de burbuja pero comparando e
intercambiando elementos.
Cuando el incremento toma un valor de 1, todos los elementos pasan a
formar parte del subgrupo y se aplica insercin directa.
El mtodo se basa en tomar como salto N/2 (siendo N el nmero de
elementos) y luego se va reduciendo a la mitad en cada repeticin hasta que el
salto o distancia vale 1.


9
Ejemplo:
Para el arreglo a = [6, 1, 5, 2, 3, 4, 0]
Tenemos el siguiente recorrido:
Recorrido Salto Lista Ordenada Intercambio
1 3 2,1,4,0,3,5,6 (6,2),(5,4),(6,0)
2 3 0,1,4,2,3,5,6 (2,0)
3 3 0,1,4,2,3,5,6 Ninguno
4 1 0,1,2,3,4,5,6 (4,2),(4,3)
5 1 0,1,2,3,4,5,6 Ninguno































10
ORDENAMIENTO RADIX SORT
Radix Sort
Para el ordenamiento con Radix Sort lo primero que se necesita saber es la
cantidad de veces que se aplicar el ordenamiento, esto es igual al nmero de
dgitos del nmero con ms longitud en la lista.
Ejemplo:
Lista: 31, 75, 560, 1, 62, el nmero con ms dgitos es el 560, que contiene
3 dgitos, por lo tanto se darn 3 vueltas en la ordenacin.
Lista: 6, 4, 8, 2, en este caso todos los nmeros son de un dgito entonces
el nmero mayor de dgitos es 1, por lo tanto se dar solo una vuelta para ordenar.
Despus se verifica el primer dgito de derecha a izquierda y se acomoda
dependiendo su valor, este proceso se repite las veces necesarias para el
ordenamiento, es decir, el nmero mayor de dgitos del nmero con ms longitud
de la lista.

Ejemplo:
Lista de nmeros: 35, 62, 56, 3, 16.
Representacin en una lista enlazada:

El nmero de veces que se repetir el ordenamiento es 2.
Se toma en cuenta el primer dgito de derecha a izquierda, 35, 62, 56, 3, 16,
estos nmero se acomodan en un arreglo de listas enlazadas del 0 al 9
dependiendo que valor les corresponda.

11

Se vuelven a juntar los nmeros como haya quedado en una lista enlazada:

Se vuelve a hacer otra vuelta, pero ahora tomando en cuenta el siguiente
dgito, en el caso de que ya no tenga ms dgitos a la izquierda se le agrega un
cero imaginario (como en el caso del nmero 3), 62, 03, 35, 56, 16 y se acomodan
de nuevo en la lista del 0 al 9.


Se junta nuevamente y nos queda:

Esta es la ltima vuelta por lo tanto los nmeros ya estn ordenados.

12
En las paginas anteriores se vieron los conceptos y pruebas manuales de
cmo funciona cada mtodo ahora veremos ejemplos ya hechos como programas.
Ejemplo del mtodo burbuja, quick sort, sort y shellsort hecho en Dev c++:
Nota: El programa se hizo como modo proyecto para ahorrar espacio y tiempo en
pruebas y ejecuciones.
archivo fuente METODOS DE ORDENAMIENTO:
Este archivo fuente contiene el men y las llamadas a las funciones para que se
ejecuten segn su funcin.
#include <stdio.h>
#include <conio.h>
#define MAX 5
int opcion;
int datoA;
main()
{
printf("\n<<<<<<<<<<<<<<<<<<<<<<MENU>>>>>>>>>>>>>>>>>>>>>>>>>>>");
printf("\n1.-BURBUJA");
printf("\n2.-QUICKSORT");
printf("\n3.-SORT");
printf("\n4.-SHELLSORT");
printf("\n----->ELIGE UNA OPCION DEL MENU:<-----\n");
scanf("%d",&opcion);
system("cls");
pasodeparametro(datoA);//paso de dato por parametro
getch();
}
pasodeparametro(){ //llamada a la Funcion
if(opcion==1){
printf("\n----->METODO DE ORDENAMIENTO BURBUJA<----------\n\n");
llamarburbuja(); //llamada a la Funcion en VariablesExternas.h
}

13

if(opcion==2){ //llamada a la Funcion
printf("\n----------->METODO DE ORDENAMIENTO QUICKSORT<------------\n\n");
llamarquicksort(); //llamada a la Funcion en VariablesExternas.h
}
if(opcion==3){ //llamada a la Funcion
printf("\n----------------->METODO DE ORDENAMIENTO SORT<---------------\n\n");
llamarsort(); //llamada a la Funcion en VariablesExternas.h
}
if(opcion==4){ //llamada a la Funcion
printf("\n------------->METODO DE ORDENAMIENTO SHELLSORT<------------\n\n");
llamarshellsort(); //llamada a la Funcion en VariablesExternas.h
}
}



Archivo fuente VariablesExternas.h

En este archivo fuente se encuentran declaradas todas las funciones que se harn
llamadas para el funcionamiento del programa.

extern void llamarsort();
extern void llamarquicksort();
extern void llamarshellsort();
extern void llamarburbuja();
extern void pasodeparametro();
extern void OrdenQuicksort();


14
Archivo fuente burbuja:
En este archivo fuente se encuentra contenida el proceso que hace el ingreso y
ordenamiento de los datos. Solo se le hace llamad a la funcin principal llamar
burbuja y este se ejecuta y realiza la operacin.
llamarburbuja()
{
int areglo[10];
int i=0; /*indice para ordenar*/
int j=0; /*indice para comparar*/
int numdatos=6; /*total de datos en el vector o areglo*/
int vauxiliar=0;
printf("\n INGRESA 10 NUMEROS: \n");
for (i=0;i<=5;i++)
{
scanf("%d",&areglo[i]);
}
printf("\n \n");
for(i=0;i<numdatos-1;i++) /*ciclo para ordenamiento*/
for(j=0;j<numdatos-1;j++) /*ciclo para comparar*/
if(areglo[j]<areglo[j+1]) /*comparacion, ordenamiento ascendente*/
{
vauxiliar=areglo[j]; //intercambio de valores con indices para el
areglo[j]=areglo[j+1]; //ordenamiento
areglo[j+1]=vauxiliar;
}
printf("\nVECTOR O ARREGLO ORDENADO POR EL METODO BURBUJA:");
for(i=0;i<numdatos;i++)
printf("\n%d",areglo[i]); /*resultado en pantalla*/
getch();
}


15
Archivo fuente quick sort:
En este archivo fuente se encuentra contenida el proceso que hace el ingreso y
ordenamiento de los datos. Solo se le hace llamad a la funcin principal llamar
quicksort y este se ejecuta y realiza la operacin del ordenamiento con el mtodo
quick sort.

int i=0; //indice del vector a conocer
int dato=1;
void OrdenQuicksort(); //variable indice que manejara los datos de
ingreso en pantalla
void llamarquicksort(){
int long Arreglo[5]; //arreglo con un tamao max declarado anteriormente como
constante
printf("INGRESA 5 DATOS\n\n");
for(i=0;i<5;i++) // ciclo que maneja los ingresos de datos
{
printf("DATO %d-->",dato);
scanf("%d",&Arreglo[i]);//va guardando los datos ingresados en la
posicion i del arreglo
dato++; //incremento en pantalla de los numeros de datos
a pedir
}

OrdenQuicksort(Arreglo, 0,5-1); /* llamada a la funcion ingresando los
parametros indicados,
el cero indica en que posicion comenzara a ordenar los
datos */
printf("\nDATOS ORDENADOS POR EL METODO QUICKSORT:");
for(i = 0; i < 5; i++)
printf("\n%d\n",Arreglo[i]);// imprime en pantalla los numeros ya ordenados
getch();

}
void OrdenQuicksort(int* arr, int izq, int der) //funcion que hace el procedimiento
de arreglo de los numeros
{
int i = izq, j = der, tmp; /*igualamos las variables (indices,"i","j") y la variablr tmp
que sirve para
el intercambi de valor*/
int p = arr[(izq + der) / 2];/*declaramos la variable pivote sumando los valores
de los extremos y dividimos entre 2 para obtener la media del arreglo*/




16
while (i <= j)
{
while (arr[i] < p) i++; /*mientras que el valor en la pocision i sea menor que
el valor
del pivote la variable I se incrementara en 1 */
while (arr[j] > p) j--;/*mientras que el valor en la pocision j sea mayor que el
valor
del pivote la variable j decrementara */
if (i <= j)
{
tmp = arr[i]; // en estos 5 linea se haran los intercambios de valores
para el ordenamiento
arr[i] = arr[j]; //asi quedandonos listo los datos
arr[j] = tmp;
i++; j--;
}
}

if (izq < j)
OrdenQuicksort(arr, izq, j);/*llamada a la funcion Quicksort indicando el
parametro a llamar
si la condicion se cumple*/
if (i < der)
OrdenQuicksort(arr, i, der);/*llamada a la funcion Quicksort indicando el
parametro a llamar si la condicion se cumple*/
}



















17
Archivo fuente sort:
En este archivo fuente se encuentra contenida el proceso que hace el ingreso y
ordenamiento de los datos. Solo se le hace llamad a la funcin principal llamarsort
y este se ejecuta y realiza la operacin del ordenamiento con el mtodo sort.


llamarsort(){
int Arreglo[5]; //declaracion del arreglo
int j=0; /*declaracion de variable global tipo entero*/
int i=0; //indice para el arreglo
int aux=0; //variable auxiliar para el intercambio de
valores
int igreso=0; //variable que maneja los datos que ingrese el
usuario
int numero=0;
int valorA;
printf("INGRESA LA CANTIDAD DE ARREGLOS: ");
scanf("%d", &igreso);
for(i=1;i<=igreso;i++) /*condicion del ingreso de la cantidad de
datos en pantalla*/
{
scanf("%d", &Arreglo[i]);
}

for(numero=igreso;numero>0;numero--) /*ciclo para las condiciones
siguientes*/
{
for(i=1;i<=numero;i++)
{
aux=Arreglo[i];
j=i/2;
while(j>0 && Arreglo[j]<aux)

18
{
Arreglo[i]=Arreglo[j]; /*intercambio de datos para comparar*/
i=j;
j=j/2;
}

Arreglo[i]=aux;
}
valorA=Arreglo[1]; /* comparacion de datos y ordenamiento
con las siguientes lineas*/
Arreglo[1]=Arreglo[numero];
Arreglo[numero]=valorA;
}

printf("\n\nDATOS ORDENADOS POR EL METODO SORT:\n");
for(i=1;i<=igreso;i++)
{
printf("\n%d",Arreglo[i]);
}
getch();
}











19
Archivo fuente Shell sort:
En este archivo fuente se encuentra contenida el proceso que hace el ingreso y
ordenamiento de los datos. Solo se le hace llamad a la funcin principal
llamarshellsort y este se ejecuta y realiza la operacin del ordenamiento con el
mtodo shellsort.

llamarshellsort(){

int Arreglo[5]; /*declaracion del arreglo con una cantidad de
caracteres definido */
int n; //variable que guardara los datos de ingreso en pantalla
int inicio;
int i; //variable contador para incremento de datos en pantalla
ej. DATO [X]
int j; //variable global que servira para comparar los valores
int aux; //variable auxiliar para el ordenamiento

printf("CUANTOS DATOD QUIERES INGRESAR: ");

scanf("%d",&n);

for (i=1; i<=n; i++) //ciclo para el ingreso de datos en pantalla

{

printf("\nELEMENTO NUMERO %d--> ", i);

scanf("%d",&Arreglo[i]); //los datos ingresados en pantalla los ira
posicionando el el arreglo i

}

inicio = n/2; //la cantidad de datos ingresados sera dicidida entre
dos y asi sucesivamente

while (inicio > 0) //mientras que ninicio sea mayor a cero

{

for (i = inicio +1; i<=n; i++) //ciclo para comparar los datos ingresados ya
divididos




20
{

aux = Arreglo[i];

j=i;

while ( (j-inicio) > 0 ) //mientras que el indice j -inicio sea mayor a cero

{

if (aux < Arreglo[j-inicio]) //condicion del ordenamiento

{

Arreglo[j]=Arreglo[j-inicio]; //intercamb para ordenamiento

j=j-inicio;

}
else
break;
} // fin del while
Arreglo[j]=aux;
} // fin del for
inicio = inicio/2;
} // fin del while
printf("\n");
printf("\nDATOS ORDENADOS POR EL METODO SHELLSORT\n");

for (i=1; i<=n; i++)

printf("\n%d", Arreglo[i]);
getch();
}

Salida en pantalla del menu:


21
Salida en pantalla del mtodo burbuja:


Salida en pantalla del quick sort:


Salida en pantalla del sort:




22
Salida en pantalla del shell sort:






CONCLUSIN

En conclusin estos mtodos de ordenamiento que se mostraran
anteriormente es una manera fcil o practico de cmo ordenar ciertos datos en un
arreglo, en este caso solo hicimos mencin de cuatro de ellas, tendr que recalcar
que no solo estos cuatro mtodos existen si no que hay ms de estas pero nos
enfocamos principalmente en cuatro que son las que ya vimos en las paginas
anteriores.
Para dar fin a esta documentacin les agradezco la atencin prestada
afirmando as los conocimientos adquiridos en este trabajo, por mencionar algunas
al manejo de los for anidados cosa que yo no saba muy bien y tambin algunos
detalles sobre arreglos.
As pues dejo por concluido este tema





23













BIBLIOGRAFIA
Codifcalo. Programando. Disponible en:
http://codificalo.com/index.php/categorias/8-estructuras-de-datos/4-
ordenamiento-radix-sort consulta [2013 18 abril]

Wikipedia. Metododeordenamiento. Disponible en:
http://es.wikipedia.org/wiki/Ordenamiento_Radix consulta[2013 18 abril]

Galen. Disponible en:
http://www.estructuradedatos.galeon.com/burbujatext.htm
Consulta [2013 18 abril]

Angel fire. Disponible en:
http://www.angelfire.com/wy2/est_info/quicksort.html
Consulta [2013 18 abril]

Al rincn del vago. Mtodos de ordenamiento. Disponible en:
http://html.rincondelvago.com/ordenacion-por-shell.html
Consulta [2013 18 abril]

DOTNETCR. Disponible en:
http://www.dotnetcr.com/metodo-de-ordenamiento-shell/
Consulta [2013 18 abril]

Das könnte Ihnen auch gefallen