Está en la página 1de 15

1

ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT en LLS
5 15 4 23 6 12
1 2 3 4
5 N=6
L
12
6 15 23 5
-1 -1
4
12 15 23
-1
15
23
23
Base
Tope
i=1..N
Li=Base + i
Funcin de
Direccionamiento
T
2
ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT
BT
12
6 15 23 5
-1 -1
4
8 11 12
14
11
12
12
1
2
3
4 5 6
7
8
9
10
11
12
13
14 15
12 11 12 8 11 12 14 12 4 6 15 23 5 -1 -1
8 9 10 11
12
13 14
15=T
1 2 3 4
5
6 7
23 LLS
Base Tope
i=1..T
Li=Base + i
Funcin de
Direccionamiento
Base
Li=Tope
3
ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT
BT
12
6 15 -1 5
-1 -1
4
8 11 13
14
11
13
11
1
2
3
4 5 6
7
8
9
10
11
12
13
14 15
11 11 13 8 11 13 14 12 4 6 15 -1 5 -1 -1
8 9 10 11
12
13 14 15=T 1 2 3 4
5
6 7
15 23 LLS
Base
Li
Base Tope
i=1..T
Li=Base + i
Funcin de
Direccionamiento
Tope
4
ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT
BT
12
6 -1 -1 5
-1 -1
4
8 10 13
14
8
13
8
1
2
3
4 5 6
7
8
9
10
11
12
13
14 15
8 8 13 8 10 13 14 12 4 6 -1 -1 5 -1 -1
8 9 10 11
12
13 14 15 1 2 3 4
5
6 7
12 15 23 LLS
i=1..T
Li=Base + i
Funcin de
Direccionamiento
Base Tope
Base
Li
Tope
5
ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT
NUMERO DE HOJAS DEL BT una potencia de 2
.
La potencia de 2 ms pequea >=n en donde n
es el nmero de elementos a ordenar.
Ejemplo es : 2
3
>= 6 n=6 k=3

CLASE LISTA LINEAL SECUENCIAL LLS
Lls
-Nodo *Base
- Nodo *Tope
- int n

+ LLS(int)
+void Info_Nodo(int)
+Nodo* R_Tope()
+Nodo* R_Base()
+Nodo* R_Max()
+ void Mostrar_Lls( ..:^listBox)
+~LLS()
Nodo
+ int Info
TOURNAMENT
+ int TAM (int )
+ void Inicializar_Hojas (Lls *,Lls*,int,int)
+ void Construir_Ramas(Lls *,int)
+ IMP (int)
+ void REAJUSTE(int,Lls *)
+void Tournament(Lls *,int,Lls*,int)
7
ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT
COMO IMPLEMENTAR EL RBOL BT?
1. CALCULAR EL NMERO DE ELEMENTOS DE BT.

T = 2
(K+1)
-1

int TAM (int N)
{
int t=1;
do {
t=t*2

} while (N>T)
return 2*t -1
}
8
ORDENAMIENTO DE COMPETENCIA O TOURNAMENT
CAL ES EL CONTENIDO DE BT?

1. HOJAS CONTIENEN LOS VALORES A ORDENAR Y/O VALORES
nocomp

2. NODOS INTERNOS POSICIONES DE LOS NODOS A ORDENAR
SEGN COMPETENCIA A >B .

ALMACENAMOS EN BT :

A) LI =BT->R_Base()+1..BT->R_Base()+T/2 NODOS INTERNOS : DIRECCIONES
B) LI=Base + T/2+1Base + T NODOS HOJAS : VALORES A ORDENAR Y/O
NOCOMP
BT
12 11 12 8 11 12 14 12 4 6 15 23 5 -1 -1
8 9 10 11
12
13 14
15=T
1 2 3 4
5
6 7
Base Tope
5 15 4 23 6 12
1 2 3 4
5
L
Base
Tope
N=6
i=1..N
Li=Base + i
Funcin de
Direccionamiento
9
ORDENAMIENTO DE COMPETENCIA O
TOURNAMENT
INICIALIZAR HOJAS DEL ARBOL CON VALORES A ORDENAR
INICALIZAR RESTOS DE HOJAS CON NOCOMP
CALCULAR Y ASIGNAR LAS DIRECCIONES DE NODOS A ORDENAS A
NODOS INTERNOS
NIVEL POR ENCIMAS DE HOJAS
NIVELES SUPERIORES HASTA LA RAIZ
INICIAR TOURNAMENT (COMPETENCIA)
1. SACAMOS PRIMER ELEMENTO BT(BT(1)
2. REAJUSTAMOS ARBOL

Repetir 1 y 2 hasta finalizar.
10
Void Inicializar_Hojas (Lls *BT,Lls *L,int n,int t)
{
int Nocomp=-1
int i, k;
Nodo *Li, *Lk;
k=t/2+1;
for ( i=1;i<=n;i++){
Li=L->R_Base()+i;
Lk=BT->R_Base()++k;
Lk->Info=Li->Info;
k=k+1;
}
while (k<=t) {
Lk=BT->R_Base()++k;
Lk->Info=Nocomp;
}
return;
}
void Construir_ramas(Lls *BT, int t){
int j,k,l;
Nodo *Lj,*Lk,*Ll;
j=t/2+1;
while ( j<t){ // Calculo de padres de las hojas
k=j/2
Lj=BT->R_Base()+j;
Lk=BT->R_Base()+k;
if( Lj->Info >= (Lj+1)->Info){
Lk->Info = j;
}
else{
Lk->Info=j+1;
}// endif
j=j+2;
} //endwhile
// Dems nodos internos
k=(t/2+1)/2;
while (k>1){
j=k;
while(j<=2*k -1){
l=j/2;
Ll=BT->R_Base()+l;
Lj=BT->R_Base()+j;
Lk=BT->R_Base()+j+1;
Lj=BT->R_Base()+Lj->Info;
Lk=BT->R_Base()+Lk->Info;
if (Lj->Info >=Lk->Info){
Ll->Info=Lj->Info;
}
else {
Ll->Info=(Lj+1)->Info;
} //endif
j=j+2;
} //endwile
k=k/2;
} //endwile
return
}
ORDENAMIENTO DE COMPETENCIA O TOURNAMENT
11
ORDENAMIENTO DE COMPETENCIA O TOURNAMENT
void Tournament(Lls *L,int n,Lls *BT,int t)
{
int k,i;
Int Nocomp=-1;
Nodo *Li ,*Lk;
for( k =N; k>=2;k--){
i=(L->R_Base()+1)->Info;
Lk=L->R_Base()+k;
Li=BT->Base()+i;
Lk->Info=Li->Info;
Li->Info=NOCOMP
REAJUSTE(i,BT);
} // ENDFOR
return
}
int IMP(int i){
return i%2;
}
void REAJUSTE(int i,Lls *BT)
{
int j,l;
Nodo * Lj,*Li,*Ll;
j=i/2
//Promover Nodo a padre
Lj=BT->R_Base()+j;
if(IMP(i)){
Lj->Info=i-1;
}
else{
Lj->Info=i+1;
} // ENDIF
i=i/2;
while(i>1){
if( IMP(I)){
j=i-1;
}else{
j=I+1;
} // ENDIF
l=i/2;
Ll=BT->R_Base()+l;
Li=BT->R_base()+i;
Li=BT->R_Base()+Li->Info;
Lj=BT->R_base()+j;
Lij=BT->R_Base()+Lj->Info
if(Li->info >=Lj->Info){
Li=BT->R_base()+i;
Ll->Info =Li->Info
}else {
Lj=BT->R_base()+j;
Ll->Info =Lj->Info
}// ENDIF
i=i/2;
} //ENDWILE
return
}
12
ORDENAMIENTO HEAPSORT
Se define un ordenamiento en grupo de
tamao n como un rbol binario casi completo
de n nodos tal que el contenido de cada nodo
es mas pequeo o igual a la de su padre.
33 92 37 57 86 12 48 25
1 2 3 4
5 6 7
8
A
i j
13
ORDENAMIENTO HEAPSORT
i j
25
57 48
37 12
92
86
33
1
2
3
4
5
6
7
8
i=1..N
Li=Base + i
Funcin de
Direccionamiento
33 92 37 57 86 12 48 25
1 2 3 4
5 6 7
8
L
Base
Tope
Li
14
ORDENAMIENTO HEAPSORT
1. Promover el mayor a la raz (mover
hacia abajo) ---grupo inicial
2. Se remueve a(1) y se coloca en su
posicin apropiada en el arreglo
3. Se reajusta el grupo de orden k-1 ( k es
inicialmente igual a n)


Al igual que tournament
Repetir 2 y 3 desde k= n hasta 2
15
ORDENAMIENTO HEAPSORT
33 92 37 57 86 12 48 25
1=j 2=i=k 3 4
5 6 7
8
Base
Tope
for( k=N;>=2,k--){
Lk=L->R_Base()+k;
Y=Lk->Info;
Li=L->R_Base()+1
Lk->Info=Li->Info;
i=1;
j=2;
Lj=L->R_Base()+j;
if ((Lj+1)->Info > Lj->Info){
j=3;
} // ENDIF
while(j<=k-1){
Lj=L->R_Base()+j;
if(Lj->Info <=Y){
exit;
}
else{
Li=L->R_Base()+i;
Li->Info=Lj->Info;
i=j;
j=2*j;
if(J+1 <= K-1){
Lj=L->R_Base()+j;
if((Lj+1)->Info > Lj->Info){
j=j+1;
} // ENDIF
}// ENDIF
} //ENDIF
} //ENDWHILE
Li=L->R_Base()+i;
Li->Info=Y;
} //ENDFOR
return
}
Heapsort(LS *L,int N)
{
int k,i,j,Y;
Nodo *Li,*Lj,Lk;
for(k=2;k<=N;k++){
Lk=L->R_Base()+k
Y=Lk->Info;
i=k;
j=i/2;
while (j>0){
Lj=L->R_Base()+j;
if(Y<=Lj->Info){
exit;
}
else {
Li=L->R_Base()+i;
Li->Info=Lj->Info,
i=j;
j=j/2;
} //ENDIF
} //ENDWHILE
Li=L->R_Base()+i;
Li->Info=Y;
} //ENDFOR

También podría gustarte