Vous êtes sur la page 1sur 14

Algoritmos de Ordenacion y busqueda

fisi

unmsm

Mtodos de ordenamiento
Clase COrdemamiento viene-de CObjeto
Atributos
Var
Entero: n //dimensin del vector
v Dimensin [n] ejemplar-de CEntero
Metodos
Constructor(dim)
MergeSort
mergeSort( a, inicio, fin )
mescla( a, inicio, medio, fin )
copiarArreglo( v, v1, i, dim )
quickSort
Lectura
Salida
busquedaBinaria( val )
busBinRec( a, i, f, val )
busBinRec( val )
intercambiar( a, b )
quickSort
quickSort( inicio, fin )
heapSort
fClase
Mtodo COrdemamiento.Constructor( dim )
ndim
vnuevo ejemplar-de CArreglo Dimesin[n]
fMtodo
Mtodo COrdemamiento.Salida
Escribir Los elems del arreglo son
Para k desde 1 hasta n hacer
Escribir v[k]
fPara
fMtodo
Mtodo COrdemamiento.Lectura
Escribir ingrese los elem del arreglo
Para k desde 1 hasta n hacer
Leer dato
V[k] dato
fPara
fMtodo
Mtodo COrdemamiento.MergeSort
mergeSort( v, 1, n )
fMtodo
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

Mtodo COrdemamiento.mergeSort(a, inicio, fin )


Entero: c
Si(inicio<fin)Entonces
c (inicio+fin)div2
mergeSort(a,inicio,c)
mergeSort(a,c+1,fin)
mescla(a,inicio,c,fin)
fSi
fMetodo
Mtodo COrdemamiento.Longitd(a)
Entero: i 0
Mientras (a[i]nulo) Hacer
i i+1
fMientras
Retornar i
fMetodo
Mtodo COrdemamiento.mescla(a, inicio, medio, fin)
aux Dimesin[Longitd(a)] ejemplar de CArreglo
Entero: x,y,z
x inicio
z inicio
y medio+1
Mientras( x<=medio ) y (y<=fin) Hacer
Si (a[x]<=a[y]) Entonces
aux[z]=a[x]
xx+1
zz+1
Sino
aux[z]=a[y]
zz+1
yy+1
fSi
Mientras (x<=medio)
aux[z]=a[x]
xx+1
zz+1
fMientras
Mientras (y<=fin)
aux[z]=a[y]
zz+1
yy+1
fMientras
fMientras
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

copiarArreglo (a, aux, inicio, fin-inicio+1)


fMetodo
Mtodo COrdemamiento.copiarArreglo (v,v1,i,dim)
Entero k
Para k desde i hasta dim hacer
v[k] v1[k]
fPara
fMetodo
Mtodo COrdemamiento.busquedaBinaria(val)
Entero: i,f,c
i1
fn
c(i+f)/2
Mientras(i<f) y (v[c]val)Hacer
Si(val<v[c])Entonces
f c-1
Sino
I c+1
fSi
c (i+f) div 2
fMinetras
Si(val=v[c])Entonces
Retornar(el elem se encuentra en la pos,c)
else
Retornar(el elem no se encuentra en el vector)
fSi
fMetodo
Mtodo COrdemamiento.busBinRec(val)
Retornar busBinRec(v,1,n,val)
fMetodo
Mtodo COrdemamiento.busBinRec(a, i, f, val)
Entero: c -1
Si(f<i)Entonces
Retornar c
Sino
C (i+f) div 2
Si(val<a[c])Entonces
Retornar busBinRec(a,c+1,f,val)
Sino
Si(a[c]<val)Entonces
Retornar busBinRec(a,c+1,f,val)
Sino
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

Retornar c
fSi
fSi
fMetodo
Mtodo COrdemamiento.ordenamientoInsercionDirecta
Entero: i,j,c
Para i desde 1 Hasta n Hacer
cv[i]
ji-1
Mientras((j>=0) y v[j] >c))Hacer
v[j+1] v[j]
jj-1
fMientras
v[j+1]c
fPara
fMetodo
Mtodo COrdemamiento.quickSort
quickSort(1,n)
fMetodo
Mtodo COrdemamiento.quickSort( inicio, fin )
Entero: i,f,pivote
iinicio
ffin
pivotev[(inicio+fin)div2]
Hacer
Mientras((v[i]<pivote) y (f<=fin))Hacer
i i+1
fMientras
Mientras(pivote<v[f])Hacer
f f-1
fMientras
Si(i<=f)Entonces
intercambiar(v[i],v[f])
i i+1
f f-1
fSi
Mientras(i<=f)
Si(inicio<f)Entonces
quickSort(inicio,f)
fSi
Si(i<fin) Entonces
quickSort(i,fin)
fSi
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

fMetodo
Mtodo COrdemamiento.intercambiar(a, b)
auxa
ab
baux
fMetodo
Mtodo COrdemamiento.heapSort
Entero: j, i, k, item
Para k desde n hasta 1 Hacer
Para i desde 1 hasta k Hacer
item v[i]
j i div 2
Mientras (j>1 && v[j]<item) Hacer
v[i] v[j]
I j
J j div 2
fMientras
v[i] item
fPara
intercambiar(v[1],v[k])
fPara
fMetodo
Mtodo COrdemamiento.ordenBurbuja
Entero: i,j
Logico: sw falso
Mientras ((no sw) y (i<n)) Hacer
Sw verdad
Para j desde 1 hasta n Hacer
Si(v[j]>v[j+1]) Entonces
intercambiar(v[j],v[j+1])
sw falso
fSi
fPara
i i+1
fMientras
fMetodo
Mtodo COrdemamiento.ordenacionPorInsercion
Entero: aux, i, k
Logico: sw falso
Para i desde 1 hasta n Hacer
Aux v[i]
k i-1
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

sw false
Mientras (( no sw) y (k>=0)) Hacer
Si(aux<v[k]) Entonces
v[k+1] v[k]
k k-1
Sino
sw verdad
fSi
fMientras
v[k+1] aux
fPara
fMetodo
Mtodo COrdemamiento.insercionDirecta
Entero: i, j, k
Para i desde 2 hasta n Hacer
k v[i]
j i - 1
Mientras (j >= 0 ) y ( v[j] > k) Hacer
v[j + 1] v[j]
j j-1
fMientas
v[j + 1] k
fPara
fMetodo
Mtodo COrdemamiento.ordenPorInsercionBinaria
Entero: aux, p, u, c, i, k
Para i desde 2 hasta n Hacer
aux v[i]
p 1
u i-1
Mientras ( p <= u ) Hacer
c (p+u) div 2
Si ( aux<v[c] ) Entonces
u c-1
Sino
p c+1
fSi
fMientras
Para k desde i-1 Hasta p Hacer
v[k+1] v[k]
fPara
v[p] aux
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

fPara
fMetodo
Mtodo COrdemamiento.ordenacionPorSeleccion
Entero aux, k, j, i 1
Mientras ( i < n ) Hacer
aux v[i]
k i
j i
Mientras ( j < n ) Hacer
j j+1
Si ( v[j] < aux ) Entonces
aux v[j]
k j
fSi
fMientras
v[k] v[i]
v[i] aux
i i+1
fMientras
fMetodo
Mtodo COrdemamiento.ordenacionShell
Entero: k, i, j, salto
salto n div 2
Mientras (salto>0) Hacer
Para i desde (salto+1) hasta n Hacer
j i-salto
Mientras ( j > 0 ) Hacer
k j+salto
Si ( v[j] <= v[k] ) Entonces
j 0
Sino
intercambiar(v[j],v[k])
fSi
j j-salto
fMientras
fPara
salto (salto+1) div 2
fMientras
fMetodo

rbol

Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

Clase CNodo viene-de CObjeto


Atributos
CNodo: hD,hI
Entero: valor
Metodos
Constructor()
colocarHD(CNodo hd)
colocarHI(CNodo hi)
obtenerHD
obtenerDI
fClase
Clase CArbol viene-de CObjeto
Atributos
Var
Nodo raiz
Metodos
Constructor()
insertar(valor)
rInOrden(Nodo p)
obtenerRaiz
eliminar(valor, ptr, pad)
buscar(valor)
fClase
Mtodo CArbol.rInOrden(ptr)
Si(p!=null)Entonces
rInOrden(ptr.obtenerHI)
mostrar(p.getValor())
rInOrden(ptr.obtenerHD)
fSi
fMetodo
Mtodo CArbol.obtenerRaiz
retornar raiz
fetodo
Mtodo CArbol.eliminar(valor, ptr, pad)//ptr,pad son de tipo CNodo
CNodo hijo
Si(ptr nulo)Entonces
Si(valor < ptr.obtenerValor)Entonces
Pad ptr
eliminar(valor, ptr.obtenerHI, pad)
sino
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

Si(valor > ptr.obtenerValor) Entonces


Pad ptr
eliminar(valor, ptr.obtenerHD, pad)
sino
si(ptr.obtenerHI=null)Entonces
si(pad.obtenerHD=ptr)Entonces
pad.colocarHI(ptr.obtenerHD)
sino
pad.colocarHD(ptr.colocarHD)
fSi
sino
si(ptr.obtenerHD=null)Entonces
si(pad.obtenerHI=ptr)Entonces
pad.colocarHI(ptr.obtenerHI)
sino
pad.colocarHD(ptr.obtenerHI)
fSi
sino //existe dos hijos
pad ptr
hijo pad.obtenerHD
si(hijo.obtenerHInull)Entonces
Mientras(hijo.obtenerHInull)Hacer
Pad hijo
Hijo hijo.obtenerHI
fMientras
ptr.colocarValor(hijo.obtenerValor)
pad.colocarHI(hijo.obtenerHD)
sino
ptr.setValor(hijo.obtenerValor)
pad.colcarHD(hijo.obtenerHD)
fSi
fSi
fSi
fSi
fSi
fSi
fMetodo
Mtodo CArbol.insertar(valor)
CNodo: n, aux, posP null // prepara nuevo nodo
Si (buscar(valor) null) Entonces
Escribir(ya existe")
sino
n ejemplar de CNodo
n.colocarValor(valor)
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

n.colocarHI(null)
n.colocarHD(null)
// es el primero
Si(raiz = null) Entonces
raiz n
Sino // encuentra su ubicacion
aux raiz
Mientras(aux null) Entonces
posP aux
Si(valor > aux.obtenerValor) Entonces
aux aux.obtenerHD
Sino
aux aux.obtenerHI
fsi
fMientras
// hace la insersion
Si(num > posP.obtenerValor) Entonces
posP.colocarHD(n)
Sino
posP.colocarHI(n)
fSi
fSi
fSi
fMetodo
//busca un numero en el arbol
Mtodo CArbol.Nodo buscar(valor)
CNodo aux
// empieza por la raiz
aux raiz
// mientras no sea nulo
mientras(aux null)Hacer
Si(num=aux.obtenerValor) Entonces
return aux // retorna nodo encontrado
Sino
Si (num > aux.obtenerValor) Entonces
// avanza por la derecha
aux = aux.obtenerHD
Sino
// avanza por la izquierda
aux = aux.obtenerHI
fSi
fSi
fMientras
retornar null
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

fMetodo
Mtodo CArbol.colocarRaiz(raiz)
raiz raiz
fMetodo

ordenamiento mergeSort para lista en C


#include <stdio.h>
#define MAX 100
struct Nodo{
int numero;
Nodo *sig;
};
typedef struct Nodo Lista;
typedef Lista * lista;
void crearLista (lista *);
int numNodo (lista inicio);
void mostrarLista (lista);
void FreeLista (lista *);
void mergeSort (int, int, lista *);
void mezcla (int, int, int, int, lista *);
void main (){
lista inicio= NULL;
clrscr();
crearLista(&inicio);
printf("Numeros generados aleatoriamente:\n");
mostrarLista(inicio);
int l= numNodo(inicio)-1;
mergeSort(0,MAX-1,&inicio);
printf("\n\nNumeros ordenados:\n");
mostrarLista(inicio);
FreeLista(&inicio);
getch();
}
int aleatorio(int li, int ls){
int n;
do{
n=rand()*(ls-li+1)/300+li;
}while(n<li||n>ls);
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

return n;
}
void crearLista (lista *inicio){
int i;
lista nuevo, temp;
for (i=0; i<MAX; i++){
nuevo= (lista) malloc(sizeof(Lista));
nuevo->sig= NULL;
nuevo->numero= aleatorio(0,1000);
if (*inicio == NULL)
*inicio= nuevo;
else{
temp= *inicio;
while (temp->sig != NULL)
temp= temp->sig;
temp->sig= nuevo;
}
}
}
void mostrarLista (lista inicio){
if (inicio != NULL){
printf("%d ",inicio->numero);
mostrarLista(inicio->sig);
}
}
int numNodo (lista inicio){
int c=0;
while (inicio != NULL){
inicio=inicio->sig;
c++;
}
c;
}
void FreeLista (lista *inicio){
lista temp= *inicio;
if (*inicio != NULL){
FreeLista(&((*inicio)->sig));
free(temp);
}
}
void mergeSort (int ini, int fin, lista *inicio){
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

int m, m1;
if (ini < fin){
m= (ini+fin)/2;
m1= m+1;
mergeSort(ini,m,&(*inicio));
mergeSort(m1,fin,&(*inicio));
mezcla(ini,m,m1,fin,&(*inicio));
}
}
void mezcla (int ini, int m, int m1, int fin, lista *inicio){
lista ci, cj;
int i, j, k= 0, kC[MAX];
ci= cj= *inicio;
for (i=k; i<ini; i++,ci=ci->sig);
for (j=k; j<m1; j++ ,cj=cj->sig);
kC[k]= k;
while (i<=m || j<=fin){
if (i > m){
kC[k]= cj->numero;
j++;
cj= cj->sig;
}
else
if (j > fin){
kC[k]= ci->numero;
i++;
ci= ci->sig;
}
else
if (ci->numero < cj->numero){
kC[k]= ci->numero;
i++;
ci= ci->sig;
}
else{
kC[k]= cj->numero;
j++;
cj= cj->sig;
}
k++;
}
for (ci=*inicio,i=k-k; i<ini; i++,ci=ci->sig);
for (k=0; i<=fin; i++, k++,ci=ci->sig)
ci->numero= kC[k];
Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Algoritmos de Ordenacion y busqueda

fisi

unmsm

Reyes Marzano, Alejandro

chuly_1280@hotmail.com

Vous aimerez peut-être aussi