Está en la página 1de 16

UNIVERSIDAD CONTINENTAL DE CIENCIAS E INGENIERAS

INGENIERA INFORMTICA
IV SEMESTRE

2007

Mtodos de Ordenamiento Codificados en C++

MTODOS DE ORDENAMIENTO
TCNICAS DE PROGRAMACIN I
DESCRIPCIN PROGRAMACOMPLETODECADAMTODO o o o o o o ORDENACINPORSELECCIN ORDENACINPORINSERCINDIRECTA ORDENACINPORINSERCINBINARIA ORDENACINSHELLSORT ORDENACINQUICKSORT ORDENACINHEAPSORT

GRUPO DE TRABAJO:
SAFORAS CONTRERAS DANNY H. VELAZCO MENDOZA LUIS. GUTIERREZ ZUIGA CESAR. CORTIJO PACHECO MIGUEL. BRAEZ ROMN SERGIO. ZARATE ROY

ORDENAMIENTO Es laoperacin dearreglarlosregistros deunatablaenalgnordensecuencial de acuerdoauncriteriodeordenamiento.Elordenamientoseefectaconbaseenelvalor dealgncampoenunregistro.Elpropsitoprincipal deunordenamiento eselde facilitarlasbsquedasdelosmiembrosdelconjuntoordenado. 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 cual puede ser numrico, alfabticooinclusoalfanumrico,ascendenteodescendente.

1.ORDENAMIENTOPORSELECCIN DESCRIPCIN.

Buscaselelementomspequeodelalista. Lointercambiasconelelementoubicadoenlaprimeraposicindelalista. Buscaselsegundoelementomspequeodelalista. Lointercambiasconelelementoqueocupalasegundaposicinenlalista. Repitesesteprocesohastaquehayasordenadotodalalista.

ANLISISDELALGORITMO.

Requerimientos de Memoria: Al igual que el ordenamiento burbuja, este algoritmoslonecesitaunavariableadicionalpararealizarlosintercambios. TiempodeEjecucin: Elcicloexternoseejecuta n vecesparaunalistaden elementos. Cada bsqueda requiere comparar todos los elementos no clasificados.

Ventajas:

Fcilimplementacin. Norequierememoriaadicional. Rendimientoconstante:pocadiferenciaentreelpeoryelmejorcaso.

Desventajas:

Lento. Realizanumerosascomparaciones.

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

2.ORDENAMIENTOPORINSERCINDIRECTA DESCRIPCIN. El algoritmo de ordenacin por el mtodo de insercin directa es un algoritmo relativamente sencillo y se comporta razonablemente bien en gran cantidad de situaciones. Completa la tripleta de los algoritmos de ordenacin ms bsicos y de orden de complejidadcuadrtico,juntoconSelectionSortyBubbleSort. Sebasaenintentarconstruirunalistaordenadaenelinteriordelarrayaordenar. Deestostresalgoritmoseselquemejorresultadodaaefectosprcticos.Realizauna cantidaddecomparacionesbastanteequilibradaconrespectoalosintercambios,ytiene unpardecaractersticasquelohacenaventajaralosotrosdosenlamayorpartedelas situaciones. Estealgoritmosebasaenhacercomparaciones,as queparaquerealicesutrabajode ordenacinsonimprescindiblesdoscosas:unarrayoestructurasimilardeelementos comparablesyuncriterioclarodecomparacin,talquedadosdoselementosnosdigasi estnenordenono.

Encadaiteracindelcicloexternoloselementos0aiformanunalista ordenada.

ANLISISDELALGORITMO.

Estabilidad:Estealgoritmonuncaintercambiaregistrosconclavesiguales.Por lotantoesestable. Requerimientos de Memoria: Una variable adicional para realizar los intercambios. TiempodeEjecucin:Paraunalistadenelementoselcicloexternoseejecuta n1 veces. El ciclo interno se ejecuta como mximo una vez en la primera iteracin,2vecesenlasegunda,3vecesenlatercera,etc.

Ventajas:

Fcilimplementacin. Requerimientosmnimosdememoria.

Desventajas: Lento. Realizanumerosascomparaciones.

Estetambinesunalgoritmolento,peropuedeserdeutilidadparalistasqueestn ordenadasosemiordenadas,porqueenesecasorealizamuypocosdesplazamientos. CODIFICACINENC++


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

3.MTODODEORDENAMIENTOPORINSERCINBINARIA Elmtododeordenacinpor'insercinbinaria''esunamejoradelmtododeinsercin directa. Para lograr esta mejora se recurre a una bsqueda binaria en lugar de una bsquedasecuencialparainsertarunelementoenlaparteizquierdadelarreglo,queya seencuentraordenado.Elrestodelprocedimientoessimilaraldeinsercindirecta,es decir,serepiteestemismoprocedimientodesdeelsegundotrminohastael ltimo elemento. ALGORITMO INSERCIONBINARIA(A,N) { para(i=2hastaN) { aux=A[i]; izq=1; der=i1; mientras(izq<=der) { m=[parteentera((izq+der)/2)]; si(aux<A[M]) { der=m1; } sino { izq=m+1; } } j=i1; mientras(j>=izq) { A[j+1]=A[j]; j=j11; } A[izq]=auz; }

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

4.ORDENAMIENTOPORELMTODODESHELL ElmtodoShellesunaversinmejoradadelmtododeinsercindirecta.Estemtodo tambin seconoceconelnombredeinsercinconincrementos decrecientes.Enel mtododeordenacinporinsercindirectacadaelementosecomparaparasuubicacin correctaenelarreglo,conloselementosqueseencuentranenlaparteizquierdadel mismo.Sielelementoainsertaresmspequeoqueelgrupodeelementosquese encuentranasuizquierda,esnecesarioefectuarentoncesvariascomparacionesantesde suubicacin. Shellproponequelascomparacionesentreelementosseefectenconsaltosdemayor tamaoperoconincrementosdecrecientes,as,loselementosquedarnordenadosenel arreglomsrpidamente. ElShellsortesunageneralizacindelordenamientoporinsercin,teniendoencuenta dosobservaciones: 1. Elordenamientoporinsercineseficientesilaentradaest"casiordenada". 2. Elordenamientoporinsercinesineficiente,engeneral,porquemuevelos valoresslounaposicincadavez. ElalgoritmoShellsortmejoraelordenamientoporinsercincomparandoelementos separados por un espacio de varias posiciones. Esto permite que un elemento haga "pasosmsgrandes"haciasuposicinesperada.Lospasosmltiplessobrelosdatosse hacencontamaosdeespaciocadavezmspequeos.El ltimopasodelShellsortes unsimpleordenamientoporinsercin,peroparaentonces,yaest garantizadoquelos datosdelvectorestncasiordenados. ElShellsortllevaestenombreenhonorasuinventor,DonaldShell,quelopublicen 1959.

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

ORDENAMIENTOQUICKSORT El ordenamiento por particin (Quick Sort) se puede definir en una forma ms convenientecomounprocedimientorecursivo. Tiene aparentemente la propiedad de trabajar mejor para elementos de entrada desordenados completamente, que para elementos semiordenados. Esta situacin es precisamentelaopuestaalordenamientodeburbuja. Estetipodealgoritmossebasaenlatcnica"divideyvencers",oseaesmsrpidoy fcilordenardosarreglosolistasdedatospequeos,queunarregloolistagrande. Normalmentealiniciodelaordenacinseescogeunelementoaproximadamenteenla mitaddelarreglo,asalempezaraordenar,sedebellegaraqueelarregloesteordenado respectoalpuntodedivisinolamitaddelarreglo. Sepodr garantizarqueloselementosalaizquierdadelamitadsonlosmenoresylos elementosaladerechasonlosmayores. Lossiguientespasossonllamadosrecursivosconelpropsitodeefectuarlaordenacin porparticinalarregloizquierdoyalarregloderecho,queseobtienendelaprimera fase.Eltamaodeesosarreglosenpromediosereducealamitad. As secontinahastaqueeltamaodelosarreglosaordenares1,esdecir,todoslos elementosyaestnordenados. Enpromedioparatodosloselementosdeentradadetamaon,elmtodohaceO(nlog n)comparaciones,elcualesrelativamenteeficiente.

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

ORDENAMIENTOHEAPSORT El ordenamiento por montculos (Heap sort) es un algoritmo de ordenacin no recursivo,noestable,concomplejidadcomputacionalO(nlogn). Estealgoritmoconsisteenalmacenartodosloselementosdelvectoraordenarenun montculo (heap),yluegoextraerelnodoquequedacomonodorazdelmontculo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los montculos, por la cual, la cima contiene siempreelmenorelemento(oelmayor,segnsehayadefinidoelmontculo)detodos losalmacenadosenl. El significado de heap en ciencia computacional es el de una cola de prioridades (priorityqueue).Tienelassiguientescaractersticas: Unheapesunarreglodenposicionesocupadoporloselementosdelacola. (Nota: seutiliza unarregloqueinicia enlaposicin1ynoencero,detal maneraquealimplementarlaenCsetienenn+1posicionesenelarreglo.) Semapeaunrbolbinariodetalmaneraenelarregloqueelnodoenlaposicin ieselpadredelosnodosenlasposiciones(2*i)y(2*i+1). Elvalorenunnodoesmayoroigualalosvaloresdesushijos.Porconsiguiente, elnodopadretieneelmayorvalordetodosusubrbol. PROCEDIMIENTO HeapSortconsisteesencialmenteen: Convertirelarregloenunheap Construir un arreglo ordenado de atrs hacia adelante (mayor a menor) repitiendolossiguientespasos: Sacarelvalormximoenelheap(eldelaposicin1) Poneresevalorenelarregloordenado Reconstruirelheapconunelementomenos Utilizarelmismoarregloparaelheapyelarregloordenado.

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

ANEXO

LIBRERA UTILIZADA EN LOS CDIGOS


ORDENACINPORSELECCIN ORDENACINPORINSERCINDIRECTA ORDENACINPORINSERCINBINARIA ORDENACINSHELLSORT ORDENACINQUICKSORT

leearreglo.h

#include<iostream> using namespace std; void leeCadena(int cant,int n[]) { int i; for(i=0;i<cant;i++) { cout<<"Ingresa numero "<<i+1<<": "; cin>>n[i]; } } void muestraCadena(int cant,int n[]) { int i; for(i=0;i<cant;i++) { cout<<n[i]<<endl; } }

También podría gustarte