Implementación y Comparación de Algoritmos de Ordenamiento en C++
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define Max 120000
#define TOPE 1000
#define randomize (srand(time(0)))
#define random(num) (rand()%(num))
using namespace std;
int METODODEORDENAMIENTO();
void leerVector(int X[Max],int *dimX);
void mostrarVector(int X[Max],int dimX);
void ordenarxBurbuja(int X[Max],int dimX);
void ordenarxBurbuja_senal(int X [Max],int *dimX);
void ordenarxShaker_sort(int X[Max],int *dimX);
void ordenarxInsercion_directa(int X[Max],int *dimX);
void ordenarxInsercion_binaria(int X[Max],int *dimX);
void ordenarxSeleccion_directa(int X[Max],int dimX);
void ordenarxShell(int X[Max],int *dimX);
void ordenarxQuicksort_recursivo(int X[Max],int *dimX);
void Reduce_recursivo(int X[Max],int INI,int FIN);
void ordenarxQuicksort_iterativo(int X[Max],int *dimX);
int Reduce_iterativo(int X[Max],int INI,int FIN);
void ordenarxHeapsort(int X[Max],int *dimX);
void Inserta_monticulo(int X[Max],int *dimX);
void Elimina_monticulo(int X[Max],int *dimX);
int main()
{
int Opcion,A[Max],na;
do{
Opcion = METODODEORDENAMIENTO();
switch(Opcion)
{
case 1: {
system(«cls»);
printf(«\n*******************Proceso de Lectura del Vector Aleatorio********************\n\n»);
leerVector(A,&na);
system(«pause»);
system(«cls»);
break;
}
case 2: {
system(«cls»);
printf(«\n****************Mostramos el Vector Aleatorio Generado***********************\n\n»);
mostrarVector(A,na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 3: {
system(«cls»);
printf(«\n******************Ordenamiento por el Metodo de Burbuja************************\n\n»);
ordenarxBurbuja(A,na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 4: {
system(«cls»);
printf(«\n**************Ordenamiento por el Metodo de Burbuja con Señal****************\n\n»);
ordenarxBurbuja_senal(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 5: {
system(«cls»);
printf(«\n***************Ordenamiento por el Metodo de Shaker sort**********************\n\n»);
ordenarxShaker_sort(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 6: {
system(«cls»);
printf(«\n***************Ordenamiento por el Metodo de Inserción Directa*****************\n\n»);
ordenarxInsercion_directa(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 7: {
system(«cls»);
printf(«\n*******************Ordenamiento por el Metodo de Inserción Binaria************\n\n»);
ordenarxInsercion_binaria(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 8:{
system(«cls»);
printf(«\n***************Ordenación por el Metodo de Selección Directa******************\n\n»);
ordenarxSeleccion_directa(A,na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 9:{
system(«cls»);
printf(«\n******************Ordenamiento por el Metodo de Shell**************************\n\n»);
ordenarxShell(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 10:{
system(«cls»);
printf(«\n**************Ordenamiento por el Metodo Quicksort Recursivo*******************\n\n»);
ordenarxQuicksort_recursivo(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 11:{
system(«cls»);
printf(«\n*************Ordenamiento por el Metodo Quicksort Iterativo*********************\n\n»);
ordenarxQuicksort_iterativo(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
case 12:{
system(«cls»);
printf(«\n************************Ordenamiento por el Metodo del Montículo****************\n\n»);
ordenarxHeapsort(A,&na);
printf(«\n\n»);
system(«pause»);
system(«cls»);
break;
}
}
}while(Opcion != 0);
return(0);
}
int METODODEORDENAMIENTO()
{
int i;
do
{
system(«cls»);
printf(«================================================================================\n»);
cout << «—————-M E T O D O S D E O R D E N A M I E N T O S—————–«;
printf(«================================================================================\n»);
cout << «\n ESCOJER EL MEJOR METODO PARA ORDENAR UN VECTOR: «;
cout << «\n\n\r 0.- TERMINAR»;
cout << «\n\r 1.- LEER VECTOR «;
cout << «\n\r 2.- MOSTRAR VECTOR «;
cout << «\n\r 3.- ORDENAR X BURBUJA»;
cout << «\n\r 4.- ORDENAR X BURBUJA_SEÑAL»;
cout << «\n\r 5.- ORDENAR X SHAKER_SORT»;
cout << «\n\r 6.- ORDENAR X INSERCION_DIRECTA»;
cout << «\n\r 7.- ORDENAR X INSERCION_BINARIA»;
cout << «\n\r 8.- ORDENAR X SELECCION_DIRECTA»;
cout << «\n\r 9.- ORDENAR X SHELL»;
cout << «\n\r 10.- ORDENAR X QUICKSORT_RECURSIVO»;
cout << «\n\r 11.- ORDENAR X QUICKSORT_ITERATIVO»;
cout << «\n\r 12.- ORDENAR X HEAPSORT»;
cout << «\n\n\n\r Seleccione su opción —> «;
cin >> i;
}while(i<0 || i>12);
return(i);
}
void leerVector(int X[Max],int *dimX)
{
int n,i,val;
randomize;//randomize es aquí donde si lo pongo como comentario me genera el mismo vector y es más fácil medir el tiempo..
printf(«INGRESE LA DIMENSION DE SU VECTOR A GENERAR: «);
cin>>n;
if(n<Max)
{
for(i=0;i<n;)
{
val=random(TOPE);
X[i]=val;
i=i+1;
}
*dimX=n;
printf(«\n…………Proceso de Lectura de Números Aleatorios Completada…………\n\n»);
}
else
{
printf(«Dimensión fuera de Rango…\n\n»);
}
}
void mostrarVector(int X[Max],int dimX)
{
int i,val;
if(dimX>0){
for(i=0;i<dimX;)
{
val=X[i];
printf(«%3d «,val);
i=i+1;
}
}
else{
printf(«Vector vacío …!\n\n»);
}
}
Método de Ordenamiento de Burbuja
void ordenarxBurbuja(int X[Max],int dimX)
{
int i,j,aux;
long ini,fin;
ini = clock();// INICIA EL PROCESO DEL ORDENAMIENTO
for(int i=0;i<dimX-1;i++){
for(int j=i+1;j<dimX;j++){
if(X[i]>X[j]){
aux=X[j];
X[j]=X[i];
X[i]=aux;
}
}
}
mostrarVector(X,dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
Método de Ordenamiento de Burbuja con Señal
void ordenarxBurbuja_senal(int X [Max],int *dimX)
{
bool BAND=false;
int i=0,j,aux,
N=*dimX-1;
long ini,fin;
ini = clock();
while((i<=N-1)&&(!BAND))
{
BAND=true;
for(j=0;j<=N-1;j++)
{
if(X[j]>X[j+1])
{
aux=X[j];
X[j]=X[j+1];
X[j+1]=aux;
BAND=false;
}
}
i=i+1;
}
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
Método de Ordenamiento Shaker Sort
void ordenarxShaker_sort(int X[Max],int *dimX)//METODO DE LA SACUDIDA
{
int i,IZQ=1,aux,N=*dimX-1,k=N,DER=N;
long ini,fin;
ini = clock();
while(DER>=IZQ)
{
for(i=DER;i>=IZQ;i–)
{
if(X[i-1]>X[i])
{
aux=X[i-1];
X[i-1]=X[i];
X[i]=aux;
k=i;
}
}
IZQ=k+1;
for(i=IZQ;i<=DER;i++)
{
if(X[i-1]>X[i])
{
aux=X[i-1];
X[i-1]=X[i];
X[i]=aux;
k=i;
}
}
DER=k-1;
}
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
Método de Ordenamiento de Inserción Directa
void ordenarxInsercion_directa(int X[Max],int *dimX)
{
int i,aux,k,N=*dimX-1;
long ini,fin;
ini = clock();
for(i=1;i<=N;i++)
{
aux=X[i];
k=i-1;
while((k>=0)&&(aux<X[k]))
{
X[k+1]=X[k];
k=k-1;
}
X[k+1]=aux;
}
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
Método de Ordenamiento de Inserción Binaria
void ordenarxInsercion_binaria(int X[Max],int *dimX)
{
int i,aux,IZQ,DER,M,j,N=*dimX-1;
long ini,fin;
ini = clock();
for(i=1;i<=N;i++)
{
aux=X[i];
IZQ=0;
DER=i-1;
while(IZQ<=DER)
{
M=(int)((IZQ+DER)/2);
if(aux<=X[M]){
DER=M-1;
}
else
{
IZQ=M+1;
}
}
j=i-1;
while(j>=IZQ)
{
X[j+1]=X[j];
j=j-1;
}
X[IZQ]=aux;
}
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
Método de Ordenamiento de Selección Directa
//ORDENAMIENTO POR SELECCION
/*ESTE METODO CONSISTE EN ENCONTRAR EL MENOR ELEMENTO DEL ARREGLO
Y UBICARLO AL PRINCIPIO… LUEGO SE BUSCA EL MENOR ELEMENTO DEL RESTO Y SE
UBICA EN SEGUNDO LUGAR. SE REPITE EL PROCESO N-1 VECES*/
void ordenarxSeleccion_directa(int X[Max],int dimX)
{
int i,MENOR,k,j;
time_t ini,fin;
ini = clock();// inicia el calculo del método de ordenamiento
for(i=0;i<dimX;)
{
MENOR=X[i];
k=i;
for(j=i+1;j<dimX;)
{
if(X[j]<MENOR)
{
MENOR=X[j];
k=j;
}
j=j+1;
}
X[k]=X[i];
X[i]=MENOR;
i=i+1;
}
mostrarVector(X,dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(double)CLOCKS_PER_SEC);
}
Método de Ordenamiento Shell
void ordenarxShell(int X[Max],int *dimX)
{
int i,aux,N=*dimX-1,INT=N+1;
bool BAND;
long ini,fin;
ini = clock();
while(INT>0)
{
INT=(int)(INT/2);
BAND=true;
while(BAND)
{
BAND=false;
i=0;
while((i+INT)<=N)
{
if(X[i]>X[i+INT])
{
aux=X[i];
X[i]=X[i+INT];
X[i+INT]=aux;
BAND=true;
}
i=i+1;
}
}
}
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
Método de Ordenamiento Quicksort Recursivo
void ordenarxQuicksort_recursivo(int X[Max],int *dimX)
{
int N=*dimX-1;
long ini,fin;
ini = clock();
Reduce_recursivo(X,0,N);
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
void Reduce_recursivo(int X[Max],int INI,int FIN)
{
int IZQ=INI,DER=FIN,POS=INI,aux;
bool BAND=true;
while(BAND)
{
BAND=false;
while((X[POS]<=X[DER])&&(POS!=DER))
{
DER=DER-1;
}
if(POS!=DER)
{
aux=X[POS];
X[POS]=X[DER];
X[DER]=aux;
POS=DER;
while((X[POS]>=X[IZQ])&&(POS!=IZQ))
{
IZQ=IZQ+1;
}
if(POS!=IZQ)
{
BAND=true;
aux=X[POS];
X[POS]=X[IZQ];
X[IZQ]=aux;
POS=IZQ;
}
}
}
if((POS-1)>INI)
{
Reduce_recursivo(X,INI,POS-1);
}
if(FIN>(POS+1))
{
Reduce_recursivo(X,POS+1,FIN);
}
}
void ordenarxQuicksort_iterativo(int X[Max],int *dimX)
{
int full=0,I,F,POS,N=*dimX-1,P1[Max],P2[Max];
long ini,fin;
P1[full]=0;//PILA MENOR
P2[full]=N;//PILA MAYOR
ini = clock();
while(full>=0)
{
I=P1[full];
F=P2[full];
full=full-1;
POS=Reduce_iterativo(X,I,F);
if(I
{
full=full+1;
P1[full]=I;
P2[full]=POS-1;
}
if(F>(POS+1))
{
full=full+1;
P1[full]=POS+1;
P2[full]=F;
}
}
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
int Reduce_iterativo(int X[Max],int INI,int FIN)
{
int IZQ=INI,DER=FIN,aux,POS=INI;
bool BAND=true;
while(BAND)
{
while((X[POS]
{
DER=DER-1;
}
if(POS==DER)
{
BAND=false;
}
else
{
aux=X[POS];
X[POS]=X[DER];
X[DER]=aux;
POS=DER;
while((X[POS]>=X[IZQ])&&(POS!=IZQ))
{
IZQ=IZQ+1;
}
if(POS==IZQ)
{
BAND=false;
}
else
{
aux=X[POS];
X[POS]=X[IZQ];
X[IZQ]=aux;
POS=IZQ;
}
}
}
//return(POS);// POS variable es una variable donde se almacena el resultado del algoritmo.
}
void ordenarxHeapsort(int X[Max],int *dimX)//METODO DEL MONTICULO
{//METODO EFICIENTE QUE TRABAJA CON ARBOLES .
long ini,fin;
ini = clock();
Inserta_monticulo(X,dimX);
Elimina_monticulo(X,dimX);
mostrarVector(X,*dimX);
fin=clock();
printf(«\n\ntiempo en segundos %f s\n\n»,(fin-ini)/(float)CLOCKS_PER_SEC);
}
void Inserta_monticulo(int X[Max],int *dimX)
{
int i,k,aux,N=*dimX-1;
bool BAND;
for(i=1;i
{
k=i;
BAND=true;
while((k>0)&&BAND)
{
BAND=false;
if(X[k]>X[(int)(k/2)])
{
aux=X[(int)(k/2)];
X[(int)(k/2)]=X[k];
X[k]=aux;
k=(int)(k/2);
BAND=true;
}
}
}
}
void Elimina_monticulo(int X[Max],int *dimX)
{
int i,aux,IZQ,DER,k,AP,MAYOR,N=*dimX-1;
bool BOOL;
for(i=N;i>=1;i–)
{
aux=X[i];
X[i]=X[0];
IZQ=1;
DER=2;
k=0;
BOOL=true;
while((IZQ
{
MAYOR=X[IZQ];
AP=IZQ;
if((MAYOR
{
MAYOR=X[DER];
AP=DER;
}
if(aux
{
X[k]=X[AP];
k=AP;
}
else
{
BOOL=false;
}
IZQ=k*2;
DER=IZQ+1;
}
X[k]=aux;
}
}