UNIVERSIDAD CONTINENTAL DE CIENCIAS E INGENIERÍAS

INGENIERÍA INFORMÁTICA
IV SEMESTRE

2007

Métodos de Ordenamiento Codificados en C++

MÉTODOS DE ORDENAMIENTO
TÉCNICAS DE PROGRAMACIÓN I
DESCRIPCIÓN PROGRAMA COMPLETO DE CADA MÉTODO o o o o o o ORDENACIÓN POR SELECCIÓN ORDENACIÓN POR INSERCIÓN DIRECTA ORDENACIÓN POR INSERCIÓN BINARIA ORDENACIÓN SHELL SORT ORDENACIÓN QUICK SORT ORDENACIÓN HEAP SORT • •

GRUPO DE TRABAJO:
SAFORAS CONTRERAS DANNY H. VELAZCO MENDOZA LUIS. GUTIERREZ ZUÑIGA CESAR. CORTIJO PACHECO MIGUEL. BRAÑEZ ROMÁN SERGIO. ZARATE ROY

.

 ascendente o descendente.   el   cual   puede   ser   numérico.    .  alfabético o incluso alfanumérico. El propósito principal  de un ordenamiento  es el de  facilitar las búsquedas de los miembros del conjunto ordenado.ORDENAMIENTO Es  la operación  de arreglar los registros  de una tabla en algún orden secuencial  de  acuerdo a un criterio de ordenamiento.  El   ordenar   un  grupo   de   datos   significa   mover   los   datos   o   sus   referencias   para   que  queden   en   una   secuencia   tal   que   represente   un   orden. El ordenamiento se efectúa con base en el valor  de algún campo en un registro.

  Ventajas:  • • • Fácil implementación.   este  algoritmo sólo necesita una variable adicional para realizar los intercambios.   Cada   búsqueda   requiere   comparar   todos   los   elementos   no  clasificados. • • Requerimientos   de   Memoria:  Al   igual   que   el   ordenamiento   burbuja. ORDENAMIENTO POR SELECCIÓN DESCRIPCIÓN.1.  No requiere memoria adicional.  Repites este proceso hasta que hayas ordenado toda la lista.  Desventajas:  • • Lento.  .  Rendimiento constante: poca diferencia entre el peor y el mejor caso.  Lo intercambias con el elemento que ocupa la segunda posición en la lista.  Lo intercambias con el elemento ubicado en la primera posición de la lista.  ANÁLISIS DEL ALGORITMO.  Buscas el segundo elemento más pequeño de la lista.  Realiza numerosas comparaciones. • • • • • Buscas el elemento más pequeño de la lista.  Tiempo de Ejecución:  El ciclo externo se ejecuta  n  veces para una lista de n  elementos.

A).n.h" #define largo 50 void seleccionsort (int A[].CODIFICACIÓN EN C++ #include<iostream> using namespace std. muestraCadena(n. i++) { min=i.A).n). do{ cout<<"Cantidad de numeros a ingresar: ". #include"leearreglo.i. i<n-1. if(n<=0||n>largo) cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl. for(j=i+1. A[i]=aux . int n) { int min. j<n. }while(n<=0||n>largo). } . seleccionsort(A. leeCadena(n.aux. } } void main () { int A[largo]. A[min]=A[i]. j++) if(A[min] > A[j]) min=j. aux=A[min]. for (i=0.cin>>n.j.

  El   ciclo   interno   se   ejecuta   como   máximo   una   vez   en   la   primera  iteración.  Requerimientos   de   Memoria:   Una   variable   adicional   para   realizar   los  intercambios. • • • Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Ventajas:  • • Fácil implementación. 3 veces en la tercera.  .  Tiempo de Ejecución: Para una lista de n elementos el ciclo externo se ejecuta  n­1  veces. junto con SelectionSort y BubbleSort.  Requerimientos mínimos de memoria. Este algoritmo se basa en hacer comparaciones. Realiza una  cantidad de comparaciones bastante equilibrada con respecto a los intercambios. De estos tres algoritmos es el que mejor resultado da a efectos prácticos.  ANÁLISIS DEL ALGORITMO. El   algoritmo   de   ordenación   por   el   método   de   inserción   directa   es   un   algoritmo  relativamente   sencillo   y   se   comporta   razonablemente   bien   en   gran   cantidad   de  situaciones.2. así que para que realice su trabajo de  ordenación son imprescindibles dos cosas: un array o estructura similar de elementos  comparables y un criterio claro de comparación. y tiene  un par de características que lo hacen aventajar a los otros dos en la mayor parte de las  situaciones. 2 veces en la segunda. etc. • En cada iteración del ciclo externo los elementos 0 a i forman una lista  ordenada. ORDENAMIENTO POR INSERCIÓN DIRECTA DESCRIPCIÓN. Por  lo tanto es estable. Completa   la   tripleta   de   los   algoritmos   de   ordenación   más   básicos   y   de   orden   de  complejidad cuadrático. Se basa en intentar construir una lista ordenada en el interior del array a ordenar. tal que dados dos elementos nos diga si  están en orden o no.

 pero puede ser de utilidad para listas que están  ordenadas o semi­ordenadas.A). while (j >= 0 && A[j] > v) { A[j + 1] = A[j]. #define largo 50 void insercionDirecta(int A[]. }while(n<=0||n>largo).Desventajas:  • • Lento. if(n<=0||n>largo) cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl. j--. CODIFICACIÓN EN C++ #include<iostream> #include"leearreglo.1. } . for (i = 1.v.  Realiza numerosas comparaciones.h" using namespace std.A). } A[j + 1] = v.int n) { int i.n). leeCadena(n. muestraCadena(n. i++) { v = A[i].cin>>n. do{ cout<<"Cantidad de numeros a ingresar: ".j. i < n. insercionDirecta(A.  Este también es un algoritmo lento. j = i .n. porque en ese caso realiza muy pocos desplazamientos. } } void main () { int A[largo].

           mientras (izq<=der)                          {                             m=[parte entera ((izq+der)/2)]. es  decir.   Para  lograr   esta   mejora   se   recurre   a   una  búsqueda   binaria   en  lugar   de  una  búsqueda secuencial para insertar un elemento en la parte izquierda del arreglo. } .                           }           A[izq]=auz. que ya  se encuentra ordenado.3. se repite este mismo procedimiento desde el segundo término hasta el último  elemento.            mientras (j>=izq)                          {                            A[j+1]=A[j].                            j=j­11.                                    }                          }            j=i­1.            izq=1.                             si (aux<A[M])                                {                                  der=m­1. N) {  para (i=2 hasta N)          {            aux = A[i].                                 }                             si no                                   {                                     izq=m+1.            der=i­1. MÉTODO DE  ORDENAMIENTO POR INSERCIÓN BINARIA El método de ordenación por 'inserción binaria'' es una mejora del método de  inserción  directa. El resto del procedimiento es similar al de inserción directa.     ALGORITMO INSERCION BINARIA (A.

} } void main () { int A[largo]. izq=0. if (aux<A[m]) der=m-1. while(izq<=der) { m=((izq+der)/2). else izq=m+1.i<n.m. while(j>=izq) { A[j+1]=A[j]. if(n<=0||n>largo) cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl. do{ cout<<"Cantidad de numeros a ingresar: ".i++) { aux = A[i]. muestraCadena(n.aux.n. #define largo 50 void insercionBinaria(int A[]. insercionBinaria(A.CODIFICACIÓN EN C++ #include<iostream> #include"leearreglo.izq.h" using namespace std. j=j-1.der. leeCadena(n. } A[izq]=aux.j. for(i=1. der=i-1. } j=i-1. }while(n<=0||n>largo). } .A).cin>>n.int n) { int i.n).A).

 así. ya está garantizado que los  datos del vector están casi ordenados. Los pasos múltiples sobre los datos se  hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es  un simple ordenamiento por inserción. es necesario efectuar entonces varias comparaciones antes de  su ubicación. El Shell sort lleva este nombre en honor a su inventor.  El Shell sort es una generalización del ordenamiento por inserción.  . que lo publicó en  1959. porque mueve los  valores sólo una posición cada vez. teniendo en cuenta  dos observaciones: 1. ORDENAMIENTO POR EL MÉTODO DE SHELL El método Shell es una versión mejorada del método de inserción directa. pero para entonces. con los elementos que se encuentran en la parte izquierda del  mismo. El ordenamiento por inserción es ineficiente.4. Donald Shell. Este método  también  se conoce con el nombre de inserción con incrementos  decrecientes. los elementos quedarán ordenados en el  arreglo más rápidamente. Si el elemento a insertar es más pequeño que el grupo de elementos que se  encuentran a su izquierda.  El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos  separados   por  un  espacio   de  varias  posiciones.  2. El ordenamiento por inserción es eficiente si la entrada está "casi ordenada". En el  método de ordenación por inserción directa cada elemento se compara para su ubicación  correcta en el arreglo. Shell propone que las comparaciones entre elementos se efectúen con saltos de mayor  tamaño pero con incrementos decrecientes.   Esto  permite   que  un  elemento   haga  "pasos más grandes" hacia su posición esperada. en general.

n.inc]. i < n.h" using namespace std. }while(n<=0||n>largo). } } void main () { int A[largo].inc. inc. inc<n. i++) { j = i. while (inc > 0) { for (i=inc. temp = A[i].CODIFICACIÓN EN C++ #include<iostream> #include"leearreglo. muestraCadena(n. if(n<=0||n>largo) cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl. while ((j >= inc) && (A[j-inc] > temp)) { A[j] = A[j . #define largo 50 void ordenShell(int A[]. j = j .A). do{ cout<<"Cantidad de numeros a ingresar: ".inc=inc*3+1).cin>>n. leeCadena(n. } inc/= 2. j. for(inc = 1 . temp.A).n).int n) { int i. } A[j] = temp. ordenShell(A. } .

 así al empezar a ordenar.ORDENAMIENTO QUICK SORT El   ordenamiento   por   partición   (Quick   Sort)   se   puede   definir   en   una   forma   más  conveniente como un procedimiento recursivo. Tiene   aparentemente   la   propiedad   de   trabajar   mejor   para   elementos   de   entrada  desordenados   completamente. el cual es relativamente eficiente. Así se continúa hasta que el tamaño de los arreglos a ordenar es 1. es decir. Normalmente al inicio de la ordenación se escoge un elemento aproximadamente en la  mitad del arreglo. todos los  elementos ya están ordenados. el método hace O(n log  n) comparaciones. Se podrá garantizar que los elementos a la izquierda de la mitad son los menores y los  elementos a la derecha son los mayores. se debe llegar a que el arreglo este ordenado  respecto al punto de división o la mitad del arreglo. . que se obtienen de la primera  fase. Los siguientes pasos son llamados recursivos con el propósito de efectuar la ordenación  por partición al arreglo izquierdo y al arreglo derecho. o sea es más rápido y  fácil ordenar dos arreglos o listas de datos pequeños.   que   para   elementos   semiordenados. En promedio para todos los elementos de entrada de tamaño n. El tamaño de esos arreglos en promedio se reduce a la mitad. que un arreglo o lista grande.   Esta   situación   es  precisamente la opuesta al ordenamiento de burbuja. Este tipo de algoritmos se basa en la técnica "divide y vencerás".

} void main () { int A[largo]. } . muestraCadena(n. j = der. if(n<=0||n>largo) cout<<"Debe ingresar un valor > a 0 y < a "<<largo<<endl. void quicksort(int A[]. i. A[i] = A[j]. } if( i <= j ) { aux = A[i]. j ). A[j] = aux. } }while( i <= j ). quicksort(A.n. if( izq < j ) quicksort( A.int izq.A). j.A). j--. x = A[ (izq + der) /2 ].cin>>n. do{ while( (A[i] < x) && (j <= der) ) { i++. aux.0.CODIFICACIÓN EN C++ #include <iostream> #define largo 100 #include"leearreglo. }while(n<=0||n>largo). } while( (x < A[j]) && (j > izq) ) { j--.h" using namespace std.n-1). leeCadena(n. if( i < der ) quicksort( A. i++. int der ) { int i. x . der ). do{ cout<<"Cantidad de numeros a ingresar: ". izq. i = izq.

  Basa   su  funcionamiento   en   una   propiedad   de   los   montículos. Por consiguiente. PROCEDIMIENTO Heap Sort consiste esencialmente en: • • • • • • Convertir el arreglo en un heap  Construir   un   arreglo   ordenado   de   atrás   hacia   adelante   (mayor   a   menor)  repitiendo los siguientes pasos:  Sacar el valor máximo en el heap (el de la posición 1)  Poner ese valor en el arreglo ordenado  Reconstruir el heap con un elemento menos Utilizar el mismo arreglo para el heap y el arreglo ordenado. no estable.  el nodo padre tiene el mayor valor de todo su subárbol. con complejidad computacional O(n log n).  El valor en un nodo es mayor o igual a los valores de sus hijos. .ORDENAMIENTO HEAP SORT El  ordenamiento   por   montículos  (Heap   sort)   es   un  algoritmo  de  ordenación  no  recursivo. de tal  manera que al implementarla en C se tienen n+1 posiciones en el arreglo. Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un  montículo  (heap). El   significado   de   heap   en   ciencia   computacional   es   el   de   una   cola   de   prioridades  (priority queue).   la   cima   contiene  siempre el menor elemento (o el mayor.  (Nota:  se utiliza  un arreglo que inicia  en la posición 1 y no en cero.)  Se mapea un árbol binario de tal manera en el arreglo que el nodo en la posición  i es el padre de los nodos en las posiciones (2*i) y (2*i+1). según se haya definido el montículo) de todos  los almacenados en él. Tiene las siguientes características: Un heap es un arreglo de n posiciones ocupado por los elementos de la cola.   por   la   cual. y luego extraer el nodo que queda como nodo raíz del montículo  (cima)   en   sucesivas   iteraciones   obteniendo   el   conjunto   ordenado.

i<=k. for(k=n. A[k]=temp.k>0. cout<<"Ingresa la cantidad de elementos del arreglo: ". int main() { int A[max].j. while(j>0 && A[j]<item) { A[i]=A[j].temp.k.k--) { for(i=1. A[1]=A[k].i++) cout<<A[i] << endl.i++) { item=A[i]. for(i=1. j=i/2. for(i=1. } A[i]=item. } . } cout<<"El orden es:"<<endl.n. } temp=A[1].i<=n.i++) cin >> A[i]. return 0.i.CODIFICACIÓN EN C++ #include <iostream> #define max 100 using namespace std. j=j/2.item. i=j. cin>>n.i<=n.

h” #include<iostream> using namespace std.int n[]) { int i.i++) { cout<<n[i]<<endl.ANEXO LIBRERÍA UTILIZADA EN LOS CÓDIGOS ORDENACIÓN POR SELECCIÓN ORDENACIÓN POR INSERCIÓN DIRECTA ORDENACIÓN POR INSERCIÓN BINARIA ORDENACIÓN SHELL SORT ORDENACIÓN QUICK SORT “leearreglo.i<cant. } } . for(i=0. void leeCadena(int cant. for(i=0.i++) { cout<<"Ingresa numero "<<i+1<<": ".i<cant.int n[]) { int i. } } void muestraCadena(int cant. cin>>n[i].

Sign up to vote on this title
UsefulNot useful