7
GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware
GradoenIngenieríadeComputadores
LuisHernándezYáñez
FacultaddeInformáticaUniversidadComplutense
Fundamentos de la programaciónLuis Hernández Yáñez
Fundamentos de la programación: Algoritmos de ordenación
Algoritmos de ordenación 651Algoritmo de ordenación por inserción 654
Ordenación de arrays por inserción 665Algoritmo de ordenación por inserción
con intercambios 672Claves de ordenación 680Estabilidad de la ordenación 688Complejidad y eficiencia 692
Ordenaciones naturales 694Ordenación por selección directa 701Método de la burbuja 716Listas ordenadas 722Búsquedas en listas ordenadas 729Búsqueda binaria 731
Luis Hernández Yáñez
Página 651Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Ordenacióndelistas
Mostrarlosdatosenorden,facilitarlasbúsquedas,...
Variadasformasdehacerlo(algoritmos)
Página 652Fundamentos de la programación: Algoritmos de ordenación
array
125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62
0 1 2 3 4 5 6 7 8 9
array
76.95 93.45 125.40 164.29 219.99 254.62 316.05 328.80 435.00 756.62
0 1 2 3 4 5 6 7 8 9
Algoritmodeordenación(demenoramayor)
Algoritmodeordenación(demenoramayor)
array[i] <= array[i + 1]array[i] <= array[i + 1]
Luis Hernández Yáñez
OrdenacióndelistasLosdatosdelalistadebenpodersecompararentresí
Sentidodelaordenación:
Ascendente(demenoramayor)
Descendente(demayoramenor)
Algoritmosdeordenaciónbásicos:
Ordenaciónporinserción
Ordenaciónporseleccióndirecta
Ordenaciónporelmétododelaburbuja
Losalgoritmossebasanencomparacioneseintercambios
Hayotrosalgoritmosdeordenaciónmejores
Página 653Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Página 654Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
613829
AlgoritmodeordenaciónporinserciónPartimosdeunalistavacía
Vamosinsertandocadaelementoenellugarquelecorresponda
Barajadenuevecartasnumeradasdel1al9
Lascartasestándesordenadas
Ordenaremosdemenoramayor(ascendente)
Página 655Fundamentos de la programación: Algoritmos de ordenación
475
Luis Hernández Yáñez
Algoritmodeordenaciónporinserción
Página 656Fundamentos de la programación: Algoritmos de ordenación
613829475 Listaordenada:Listaordenada:
5
ColocamoselprimerelementoenlalistavacíaColocamoselprimerelementoenlalistavacía
Luis Hernández Yáñez
Algoritmodeordenaciónporinserción
Página 657Fundamentos de la programación: Algoritmos de ordenación
61382947
5 7
El7esmayorquetodosloselementosdelalista
Loinsertamosalfinal
Listaordenada:Listaordenada:
Luis Hernández Yáñez
Algoritmodeordenaciónporinserción
Página 658Fundamentos de la programación: Algoritmos de ordenación
Primerelemento(5)mayorqueelnuevo(4):
Desplazamostodosunaposiciónaladerecha
Insertamoselnuevoenlaprimeraposición
6138294
5 7 754
HemosinsertadoelelementoensulugarHemosinsertadoelelementoensulugar
Listaordenada:Listaordenada:
Luis Hernández Yáñez
4 5 7
Algoritmodeordenaciónporinserción
Página 659Fundamentos de la programación: Algoritmos de ordenación
613829
9
9esmayorquetodosloselementosdelalista
Loinsertamosalfinal
Listaordenada:Listaordenada:
Luis Hernández Yáñez
Algoritmodeordenaciónporinserción
Página 660Fundamentos de la programación: Algoritmos de ordenación
61382
9 94 5 7 7542
Primerelemento(4)mayorqueelnuevo(2):
Desplazamostodosunaposiciónaladerecha
Insertamoselnuevoenlaprimeraposición
Listaordenada:Listaordenada:
Luis Hernández Yáñez
Algoritmodeordenaciónporinserción
Página 661Fundamentos de la programación: Algoritmos de ordenación
6138
974 542 98
El9eselprimerelementomayorqueelnuevo(8):
Desplazamosdesdeesehacialaderecha
Insertamosdondeestabael9
Listaordenada:Listaordenada:
Luis Hernández Yáñez
8
Algoritmodeordenaciónporinserción
Página 662Fundamentos de la programación: Algoritmos de ordenación
613
74 542 9 987543
Listaordenada:Listaordenada:
Segundoelemento(4)mayorqueelnuevo(3):
Desplazamosdesdeesehacialaderecha
Insertamosdondeestabael4
Luis Hernández Yáñez
2 3
Algoritmodeordenaciónporinserción
Página 663Fundamentos de la programación: Algoritmos de ordenación
61
9 94 5 87 8754321
Listaordenada:Listaordenada:
Primerelemento(2)mayorqueelnuevo(1):
Desplazamostodosunaposiciónaladerecha
Insertamoselnuevoenlaprimeraposición
Luis Hernández Yáñez
Algoritmodeordenaciónporinserción
Página 664Fundamentos de la programación: Algoritmos de ordenación
6
9 91 3 4 5 7 82 876
¡¡¡LISTAORDENADA!!!¡¡¡LISTAORDENADA!!!
Listaordenada:Listaordenada:
El7eselprimerelementomayorqueelnuevo(6):
Desplazamosdesdeesehacialaderecha
Insertamosdondeestabael7
Luis Hernández Yáñez
OrdenacióndearraysporinserciónElarraycontieneinicialmentelalistadesordenada:
Amedidaqueinsertamos:doszonasenelarray
Parteyaordenadayelementosporprocesar
Página 665Fundamentos de la programación: Algoritmos de ordenación
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
ParteyaordenadaParteyaordenada ElementosporinsertarElementosporinsertar
SiguienteelementoainsertarenlaparteyaordenadaSiguienteelementoainsertarenlaparteyaordenada
Luis Hernández Yáñez
OrdenacióndearraysporinserciónSituacióninicial:Listaordenadaconunsoloelemento(primero)
Desdeelsegundoelementodelarrayhastaelúltimo:
Localizarelprimerelementomayorenloyaordenado
Página 666Fundamentos de la programación: Algoritmos de ordenación
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
Primerelementomayoroigual:índice0Primerelementomayoroigual:índice07nuevonuevo
Luis Hernández Yáñez
Ordenacióndearraysporinserción...
Desplazaraladerechalosordenadosdesdeeselugar
Insertarelnuevoenlaposiciónquequedalibre
Página 667Fundamentos de la programación: Algoritmos de ordenación
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7nuevonuevo
7 20 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7nuevonuevo
Luis Hernández Yáñez
Implementación...int nuevo, pos;// Desde el segundo elemento hasta el último...for (int i = 1; i < N; i++) {
nuevo = lista[i];pos = 0;while ((pos < i) && !(lista[pos] > nuevo)) {
pos++;}// pos: índice del primer mayor; i si no lo hayfor (int j = i; j > pos; j‐‐) {
lista[j] = lista[j ‐ 1];}lista[pos] = nuevo;
}
Página 668Fundamentos de la programación: Algoritmos de ordenación
const int N = 15;typedef int tLista[N];tLista lista;
Luis Hernández Yáñez
Página 669Fundamentos de la programación: Algoritmos de ordenación
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
20 20 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7nuevonuevo0pospos1ii
7 20 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
Luis Hernández Yáñez
Página 670Fundamentos de la programación: Algoritmos de ordenación
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5nuevonuevo0pospos4ii
Luis Hernández Yáñez
Página 671Fundamentos de la programación: Algoritmos de ordenación
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 14 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
14nuevonuevo3pospos5ii
Luis Hernández Yáñez
Página 672Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Lainsercióndecadaelementosepuederealizarconcomparacioneseintercambios
Desdeelsegundoelementohastaelúltimo:
Desdelaposicióndelnuevoelementoainsertar:
Mientraselanteriorseamayor,intercambiar
Página 673Fundamentos de la programación: Algoritmos de ordenación
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 14 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 14 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
Luis Hernández Yáñez
Página 674Fundamentos de la programación: Algoritmos de ordenación
7 14 20 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 20 5 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 14 5 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
7 5 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
Luis Hernández Yáñez
...int tmp, pos;// Desde el segundo elemento hasta el último...for (int i = 1; i < N; i++) {
pos = i;// Mientras no al principio y anterior mayor...while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) {
// Intercambiar...tmp = lista[pos];lista[pos] = lista[pos ‐ 1];lista[pos ‐ 1] = tmp;pos‐‐; // Posición anterior
}}
Página 675Fundamentos de la programación: Algoritmos de ordenación
const int N = 15;typedef int tLista[N];tLista lista;
Luis Hernández Yáñez
#include <iostream>using namespace std;#include <fstream>
const int N = 100;typedef int tArray[N];typedef struct { // Lista de longitud variable
tArray elementos;int contador;
} tLista;
int main() {tLista lista;ifstream archivo;int dato, pos, tmp;lista.contador = 0;...
Página 676Fundamentos de la programación: Algoritmos de ordenación
insercion.cppinsercion.cpp
Luis Hernández Yáñez
archivo.open("insercion.txt");if (!archivo.is_open()) {
cout << "Error de apertura de archivo!" << endl;}else {
archivo >> dato;while ((lista.contador < N) && (dato != ‐1)) {// Centinela ‐1 al final
lista.elementos[lista.contador] = dato;lista.contador++;archivo >> dato;
}archivo.close();// Si hay más de N ignoramos el restocout << "Antes de ordenar:" << endl;for (int i = 0; i < lista.contador; i++) {
cout << lista.elementos[i] << " ";}cout << endl; ...
Página 677Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
for (int i = 1; i < lista.contador; i++) {pos = i;while ((pos > 0)&& (lista.elementos[pos‐1] > lista.elementos[pos])) {
tmp = lista.elementos[pos];lista.elementos[pos] = lista.elementos[pos ‐ 1];lista.elementos[pos ‐ 1] = tmp;pos‐‐;
}}cout << "Después de ordenar:" << endl;for (int i = 0; i < lista.contador; i++) {
cout << lista.elementos[i] << " ";}cout << endl;
}return 0;
}
Página 678Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Consideracióndeimplementación¿Operadorrelacionaladecuado?
lista[pos ‐ 1] ¿> o>= ? lista[pos]
Con>= serealizanintercambiosinútiles:
Página 679Fundamentos de la programación: Algoritmos de ordenación
5 7 14 20 32 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 20 14 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
5 7 14 14 20 32 27 12 13 15
0 1 2 3 4 5 6 7 8 9
¡Intercambioinútil!¡Intercambioinútil!
Luis Hernández Yáñez
Página 680Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
ClavesdeordenaciónElementosquesonestructurasconvarioscampos:const int N = 15;typedef struct {
int codigo;string nombre;double sueldo;
} tDato;typedef tDato tLista[N];tLista lista;
Clavedeordenación:
Campoenelquesebasanlascomparaciones
Página 681Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
ClavesdeordenacióntDato tmp;while ((pos > 0)
&& (lista[pos ‐ 1].nombre > lista[pos].nombre)) {tmp = lista[pos];lista[pos] = lista[pos ‐ 1];lista[pos ‐ 1] = tmp;pos‐‐;
}
Comparación:campoconcreto
Intercambio:elementoscompletos
Página 682Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
ClavesdeordenaciónFunciónparalacomparación:bool operator>(tDato opIzq, tDato opDer) {
return (opIzq.nombre > opDer.nombre);}
tDato tmp;while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) {
tmp = lista[pos];lista[pos] = lista[pos ‐ 1];lista[pos ‐ 1] = tmp;pos‐‐;
}
Página 683Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Clavesdeordenación#include <iostream>#include <string>using namespace std;#include <fstream>#include <iomanip>const int N = 15;typedef struct {
int codigo;string nombre;double sueldo;
} tDato;typedef tDato tArray[N];typedef struct {
tArray datos;int cont;
} tLista;...
Página 684Fundamentos de la programación: Algoritmos de ordenación
claves.cppclaves.cpp
Luis Hernández Yáñez
void mostrar(tLista lista);bool operator>(tDato opIzq, tDato opDer);
int main() {tLista lista;ifstream archivo;lista.cont = 0;archivo.open("datos.txt");if (!archivo.is_open()) {
cout << "Error de apertura del archivo!" << endl;}else {
tDato dato;archivo >> dato.codigo;while ((lista.cont < N) && (dato.codigo != ‐1)) {
archivo >> dato.nombre >> dato.sueldo;lista.datos[lista.cont] = dato;lista.cont++;archivo >> dato.codigo;
}archivo.close(); ...
Página 685Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
cout << "Antes de ordenar:" << endl;mostrar(lista);for (int i = 1; i < lista.cont; i++) {// Desde el segundo elemento hasta el último
int pos = i;while ((pos > 0)
&& (lista.datos[pos‐1] > lista.datos[pos])) {tDato tmp;tmp = lista.datos[pos];lista.datos[pos] = lista.datos[pos ‐ 1];lista.datos[pos ‐ 1] = tmp;pos‐‐;
}}cout << "Después de ordenar:" << endl;mostrar(lista);
}return 0;
} ...
Página 686Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
void mostrar(tLista lista) {for (int i = 0; i < lista.cont; i++) {
cout << setw(10) << lista.datos[i].codigo<< setw(20) << lista.datos[i].nombre << setw(12) << fixed<< setprecision(2)<< lista.datos[i].sueldo << endl;
}}
bool operator>(tDato opIzq, tDato opDer) {return (opIzq.nombre > opDer.nombre);
}
Página 687Fundamentos de la programación: Algoritmos de ordenación
Cambiaacodigo osueldo paraordenarporotroscamposCambiaacodigo osueldo paraordenarporotroscampos
Luis Hernández Yáñez
Página 688Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
AlgoritmosdeordenaciónestablesAlordenarporotraclaveunalistayaordenada,lasegundaordenaciónpreservaelordendelaprimeratDato:tresposiblesclavesdeordenación(campos)
CodigoNombreSueldo
ListaordenadaporNombre
Página 689Fundamentos de la programación: Algoritmos de ordenación
12345 Álvarez 12000011111 Benítez 10000021112 Domínguez 9000011111 Durán 12000022222 Fernández 12000012345 Gómez 10000010000 Hernández 15000021112 Jiménez 10000011111 Pérez 9000012345 Sánchez 9000010000 Sergei 10000033333 Tarazona 12000012345 Turégano 10000011111 Urpiano 90000
Luis Hernández Yáñez
OrdenamosahoraporelcampoCodigo:
Página 690Fundamentos de la programación: Algoritmos de ordenación
10000 Sergei 10000010000 Hernández 15000011111 Urpiano 9000011111 Benítez 10000011111 Pérez 9000011111 Durán 12000012345 Sánchez 9000012345 Álvarez 12000012345 Turégano 10000012345 Gómez 10000021112 Domínguez 9000021112 Jiménez 10000022222 Fernández 12000033333 Tarazona 120000
10000 Hernández 15000010000 Sergei 10000011111 Benítez 10000011111 Durán 12000011111 Pérez 9000011111 Urpiano 9000012345 Álvarez 12000012345 Gómez 10000012345 Sánchez 9000012345 Turégano 10000021112 Domínguez 9000021112 Jiménez 10000022222 Fernández 12000033333 Tarazona 120000
Noestable:Losnombresnomantienensusposicionesrelativas
Noestable:Losnombresnomantienensusposicionesrelativas
Estable:Losnombresmantienensusposicionesrelativas
Estable:Losnombresmantienensusposicionesrelativas
Luis Hernández Yáñez
OrdenaciónporinserciónEstablesiemprequeutilicemos< o> Con<= o>= noesestable
Ordenamosporsueldo:
Aigualsueldo,ordenadoporcódigosyaigualcódigo,pornombres
Página 691Fundamentos de la programación: Algoritmos de ordenación
10000 Hernández 15000010000 Sergei 10000011111 Benítez 10000011111 Durán 12000011111 Pérez 9000011111 Urpiano 9000012345 Álvarez 12000012345 Gómez 10000012345 Sánchez 9000012345 Turégano 10000021112 Domínguez 9000021112 Jiménez 10000022222 Fernández 12000033333 Tarazona 120000
11111 Pérez 9000011111 Urpiano 9000012345 Sánchez 9000021112 Domínguez 9000010000 Sergei 10000011111 Benítez 10000012345 Gómez 10000012345 Turégano 10000021112 Jiménez 10000011111 Durán 12000012345 Álvarez 12000022222 Fernández 12000033333 Tarazona 12000010000 Hernández 150000
Luis Hernández Yáñez
Página 692Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Casosdeestudioparalosalgoritmosdeordenación Listainicialmenteordenada
Listainicialmenteordenadaalrevés
Listacondisposicióninicialaleatoria
¿Trabajamenos,másoiguallaordenaciónencadacaso?
Página 693Fundamentos de la programación: Algoritmos de ordenación
5 7 12 13 14 14 15 20 27 32
0 1 2 3 4 5 6 7 8 9
32 27 20 15 14 14 13 12 7 5
0 1 2 3 4 5 6 7 8 9
13 20 7 14 12 32 27 14 5 15
0 1 2 3 4 5 6 7 8 9
Luis Hernández Yáñez
OrdenacionesnaturalesSielalgoritmotrabajamenoscuantomásordenada estáinicialmentelalista,sedicequelaordenaciónesnatural
Ordenaciónporinserciónconlalistainicialmenteordenada:
Versiónquebuscaellugarprimeroyluegodesplaza:Nohaydesplazamientos;mismonúmerodecomparacionesComportamientononatural
Versiónconintercambios:Trabajamuchomenos;bastaunacomparacióncadavezComportamientonatural
Página 694Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Eleccióndeunalgoritmodeordenación¿Cómodebuenoescadaalgoritmo?
¿Cuántotardaencomparaciónconotrosalgoritmos?
Algoritmosmáseficientes:losdemenorcomplejidad
TardanmenosenrealizarlamismatareaComparamosenordendecomplejidad:O()
Enfuncióndeladimensióndelalistaaordenar:N
O() = f (N)
Operacionesquerealizaelalgoritmodeordenación:
Comparaciones
Intercambios
Asumimosquetardanuntiemposimilar
Página 695Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
CálculodelacomplejidadOrdenaciónporinserción(conintercambios):...for (int i = 1; i < N; i++) {int pos = i;while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) {
int tmp;tmp = lista[pos];lista[pos] = lista[pos ‐ 1];lista[pos ‐ 1] = tmp;pos‐‐;
}}
Intercambiosycomparaciones:Tantoscomociclosrealicenloscorrespondientesbucles
Página 696Fundamentos de la programación: Algoritmos de ordenación
ComparaciónComparación
IntercambioIntercambio
Luis Hernández Yáñez
Cálculodelacomplejidad
...for (int i = 1; i < N; i++) {int pos = i;while ((pos > 0) && (lista[pos ‐ 1] > lista[pos])) {
int tmp;tmp = lista[pos];lista[pos] = lista[pos ‐ 1];lista[pos ‐ 1] = tmp;pos‐‐;
}}
Casoenelqueelwhile seejecutamás:casopeorCasoenelqueseejecutamenos:casomejor
Página 697Fundamentos de la programación: Algoritmos de ordenación
N‐ 1ciclosN‐ 1ciclos
NºvariabledeciclosNºvariabledeciclos
Luis Hernández Yáñez
Cálculodelacomplejidad Casomejor:listainicialmenteordenada
Laprimeracomparaciónfalla:ningúnintercambio(N‐ 1)*(1comparación+0intercambios)=N‐ 1 O(N)
Casopeor:listainicialmenteordenadaalrevésParacadapos,entrei y1:1comparacióny1intercambio1+2+3+4+...+(N‐ 1)((N‐ 1)+1)x (N‐ 1)/2N*(N‐ 1)/2(N2 ‐ N)/2 O(N2)
NotaciónOgrande:ordendecomplejidadenbaseaNEltérminoenNquemásrápidamentecrecealcrecerNEnelcasopeor,N2 crecemásrápidoqueN O(N2)(Ignoramoslasconstantes,como2)
Página 698Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Ordenaciónporinserción(conintercambios) Casomejor:O(N)
Casopeor:O(N2)
Casomedio(distribuciónaleatoriadeloselementos):O(N2)
Hayalgoritmosdeordenaciónmejores
Página 699Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Órdenesdecomplejidad
O(logN) <O(N) <O(NlogN) <O(N2) <O(N3) ...
N log2 N N2
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐1 0 12 1 44 2 168 3 6416 4 25632 5 102464 6 4096128 7 16384256 8 65536...
Página 700Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Página 701Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 702Fundamentos de la programación: Algoritmos de ordenación
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
613829475
Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 703Fundamentos de la programación: Algoritmos de ordenación
6
1
3829475
Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Página 704Fundamentos de la programación: Algoritmos de ordenación
6
1
38
2
9475
Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Algoritmodeordenaciónporseleccióndirecta
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 705Fundamentos de la programación: Algoritmos de ordenación
6
1 3
8
2
9475
Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 706Fundamentos de la programación: Algoritmos de ordenación
6
1 3
8
2
9
4
75
Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 707Fundamentos de la programación: Algoritmos de ordenación
6
1 3
8
2
9
4
7
5Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 708Fundamentos de la programación: Algoritmos de ordenación
61 3
8
2
9
4
7
5Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 709Fundamentos de la programación: Algoritmos de ordenación
61 3
8
2
9
4 75Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 710Fundamentos de la programación: Algoritmos de ordenación
61 3 82
9
4 75Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Algoritmodeordenaciónporseleccióndirecta
Página 711Fundamentos de la programación: Algoritmos de ordenación
61 3 82 94 75Listaordenada:Listaordenada:
Listadesordenada:Listadesordenada:
¡¡¡LISTAORDENADA!!!¡¡¡LISTAORDENADA!!!
SeleccionarelsiguienteelementomenordelosquequedenSeleccionarelsiguienteelementomenordelosquequeden
Luis Hernández Yáñez
Ordenacióndeunarrayporseleccióndirecta
Desdeelprimerelemento(i =0)hastaelpenúltimo(N‐2):
Menorelemento(enm)entrei +1yelúltimo(N‐1)
Intercambiarloselementoseni ym sinosonelmismo
Página 712Fundamentos de la programación: Algoritmos de ordenación
20 7 14 32 5 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
mmii
5 7 14 32 20 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
mmii
SólointercambiamossinoeslamismaposiciónSólointercambiamossinoeslamismaposición
Luis Hernández Yáñez
Ordenacióndeunarrayporseleccióndirecta
Página 713Fundamentos de la programación: Algoritmos de ordenación
5 7 14 32 20 14 27 12 13 15
0 1 2 3 4 5 6 7 8 9
mmii
5 7 12 32 20 14 27 14 13 15
0 1 2 3 4 5 6 7 8 9
mmii
5 7 12 13 20 14 27 14 32 15
0 1 2 3 4 5 6 7 8 9
mmii
Luis Hernández Yáñez
Implementación
// Desde el primer elemento hasta el penúltimo...for (int i = 0; i < N ‐ 1; i++) {
int menor = i;// Desde i + 1 hasta el final...for (int j = i + 1; j < N; j++) {
if (lista[j] < lista[menor]) {menor = j;
}}if (menor > i) {
int tmp;tmp = lista[i];lista[i] = lista[menor];lista[menor] = tmp;
}}
Página 714Fundamentos de la programación: Algoritmos de ordenación
seleccion.cppseleccion.cpp
const int N = 15;typedef int tLista[N];tLista lista;
Luis Hernández Yáñez
Complejidaddelaordenaciónporseleccióndirecta¿Cuántascomparacionesserealizan?
Bucleexterno:N‐ 1ciclos
Tantascomparacionescomoelementosquedenenlalista:
(N‐ 1)+(N‐ 2)+(N‐ 3)+...+3+2+1=Nx (N‐ 1)/2=(N2 ‐ N)/2 O(N2)
Mismonúmerodecomparacionesentodosloscasos
Complejidad:O(N2) Igualqueelmétododeinserción
Algomejor(menosintercambios;unoencadapaso)
Noesestable:intercambios“alargadistancia”Nosegarantizaquesemantengaelmismoordenrelativooriginal
Comportamientononatural(trabajasiemprelomismo)
Página 715Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Página 716Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
AlgoritmodeordenaciónporelmétododelaburbujaVariacióndelmétododeseleccióndirecta
Elelementomenorvaascendiendo hastaalcanzarsuposición
Página 717Fundamentos de la programación: Algoritmos de ordenación
6
3
1
9
4
6
3
1
9
4
6
1
3
9
4
6
4
3
9
1
6
4
3
1
9
Luis Hernández Yáñez
Página 718Fundamentos de la programación: Algoritmos de ordenación
12 32 14 5 14 7
0 1 2 3 4 5
12 32 14 5 7 14
0 1 2 3 4 5
12 32 14 5 7 14
0 1 2 3 4 5
12 32 5 14 7 14
0 1 2 3 4 5
12 5 32 14 7 14
0 1 2 3 4 5
5 12 32 14 7 14
0 1 2 3 4 5
Luis Hernández Yáñez
OrdenacióndeunarrayporelmétododelaburbujaDesdeelprimero(i =0),hastaelpenúltimo(N‐ 2):Desdeelúltimo(j =N– 1),hastai +1:Sielementoenj <elementoenj ‐ 1,intercambiarlos
...int tmp;// Del primero al penúltimo...for (int i = 0; i < N ‐ 1; i++) {
// Desde el último hasta el siguiente a i...for (int j = N ‐ 1; j > i; j‐‐) {
if (lista[j] < lista[j ‐ 1]) {tmp = lista[j];lista[j] = lista[j ‐ 1];lista[j ‐ 1] = tmp;
}}
}
Página 719Fundamentos de la programación: Algoritmos de ordenación
burbuja.cppburbuja.cpp
const int N = 10;typedef int tLista[N];tLista lista;
Luis Hernández Yáñez
AlgoritmodeordenaciónporelmétododelaburbujaComplejidad:O(N2)
Comportamientononatural
Estable(mantieneelordenrelativo)
Mejora:
Sienunpasodelbucleexteriornohahabidointercambios:
Lalistayaestáordenada(noesnecesarioseguir)
14 14 14 12
16 16 12 14
35 12 16 16
12 35 35 35
50 50 50 50
Página 720Fundamentos de la programación: Algoritmos de ordenación
Lalistayaestáordenada
Nohacefaltaseguir
Luis Hernández Yáñez
bool inter = true;int i = 0;// Desde el 1º hasta el penúltimo si hay intercambios...while ((i < N ‐ 1) && inter) {
inter = false;// Desde el último hasta el siguiente a i...for (int j = N ‐ 1; j > i; j‐‐) {
if (lista[j] < lista[j ‐ 1]) {int tmp;tmp = lista[j];lista[j] = lista[j ‐ 1];lista[j ‐ 1] = tmp;inter = true;
}}if (inter) {
i++;}
}
Página 721Fundamentos de la programación: Algoritmos de ordenación
burbuja2.cppburbuja2.cpp
Estavariaciónsítieneuncomportamientonatural
Luis Hernández Yáñez
Página 722Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
GestióndelistasordenadasCasitodaslastareasserealizanigualqueenlistassinorden
Operacionesquetenganencuentaelorden:
Insercióndeunnuevoelemento:debeseguirenorden
Búsquedasmáseficientes
¿Ylacargadesdearchivo?
Siloselementosseguardaronenorden:seleeigual
Siloselementosnoestánordenadosenelarchivo:insertar
Página 723Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Declaraciones:Igualesqueparalistassinordenconst int N = 20;
typedef struct {int codigo;string nombre;double sueldo;
} tRegistro;
typedef tRegistro tArray[N];
typedef struct {tArray registros;int cont;
} tLista;
Página 724Fundamentos de la programación: Algoritmos de ordenación
lista.cpplista.cpp
Luis Hernández Yáñez
Subprogramas:Mismadeclaraciónqueparalistassinordenvoid mostrarDato(int pos, tRegistro registro);
void mostrar(tLista lista);
bool operator>(tRegistro opIzq, tRegistro opDer);
bool operator<(tRegistro opIzq, tRegistro opDer);
tRegistro nuevo();
void insertar(tLista &lista, tRegistro registro, bool &ok);
void eliminar(tLista &lista, int pos, bool &ok); // pos = 1..N
int buscar(tLista lista, string nombre);
void cargar(tLista &lista, bool &ok);
void guardar(tLista lista);
Página 725Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Nuevasimplementaciones:
Operadoresrelacionales
Inserción(mantenerelorden)
Búsqueda(máseficiente)
Seguardalalistaenorden,porloquecargar() nocambia
bool operator>(tRegistro opIzq, tRegistro opDer) {
return opIzq.nombre > opDer.nombre;
}
bool operator<(tRegistro opIzq, tRegistro opDer) {
return opIzq.nombre < opDer.nombre;
}
Página 726Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
void insertar(tLista &lista, tRegistro registro, bool &ok) {ok = true;if (lista.cont == N) {
ok = false; // lista llena}else {
int i = 0;while ((i < lista.cont) && (lista.registros[i] < registro)) {
i++;}// Insertamos en la posición i (primer mayor o igual)for (int j = lista.cont; j > i; j‐‐) {// Desplazamos una posición a la derecha
lista.registros[j] = lista.registros[j ‐ 1];}lista.registros[i] = registro;lista.cont++;
}}
Página 727Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Página 728Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
BúsquedadeunelementoenunasecuenciaNoordenada:recorremoshastaencontrarlooalfinal
Ordenada:recorremoshastaencontrarloomayor /alfinal
Buscamosel36:alllegaralfinalsabemosquenoestá
Buscamosel17:alllegaral20yasabemosquenoestá
Condicionesdeterminación:
Sellegaalfinal
Seencuentraelelementobuscado
Seencuentraunomayor
Mientrasnoalfinalyelvalorseamenorqueelbuscado
Página 729Fundamentos de la programación: Algoritmos de ordenación
5 7 12 13 14 14 15 20 27 32
0 1 2 3 4 5 6 7 8 9
Luis Hernández Yáñez
int buscado;cout << "Valor a buscar: ";cin >> buscado;int i = 0;while ((i < N) && (lista[i] < buscado)) {
i++;}// Ahora, o estamos al final o lista[i] >= buscadoif (i == N) { // Al final: no se ha encontrado
cout << "No encontrado!" << endl;}else if (lista[i] == buscado) { // Encontrado!
cout << "Encontrado en posición " << i + 1 << endl;}else { // Hemos encontrado uno mayor
cout << "No encontrado!" << endl;}
Página 730Fundamentos de la programación: Algoritmos de ordenación
Complejidad:O(N)
const int N = 10;typedef int tLista[N];tLista lista;
Luis Hernández Yáñez
Página 731Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Búsquedamuchomásrápidaqueaprovechalaordenación
Compararconelvalorqueestéenelmediodelalista:Sieselquesebusca,terminarSino,siesmayor,buscarenlaprimeramitaddelalistaSino,siesmenor,buscarenlasegundamitaddelalistaRepetirhastaencontrarloonoquedesublistadondebuscar
Página 732Fundamentos de la programación: Algoritmos de ordenación
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
Buscamosel12
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
ElementomitadElementomitad
Luis Hernández Yáñez
Vamosbuscandoensublistascadavezmáspequeñas(mitades)
Delimitamoselsegmentodelalistadondebuscar
Inicialmentetenemostodalalista:
Índicedelelementoenlamitad:mitad = (ini + fin) / 2
Sinoseencuentra,¿dóndeseguirbuscando?Buscado<elementoenlamitad:fin = mitad ‐ 1
Buscado>elementoenlamitad:ini = mitad + 1
Siini >fin,noquedadóndebuscar
Página 733Fundamentos de la programación: Algoritmos de ordenación
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
iniini finfinmitadmitad
Luis Hernández Yáñez
12 < lista[mitad] fin = mitad – 1
12 > lista[mitad] ini = mitad + 1
Página 734Fundamentos de la programación: Algoritmos de ordenación
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
iniini finfinmitadmitad
Buscamosel12
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
iniini finfinmitadmitad
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
iniini finfin
mitadmitad ¡Encontrado!
Luis Hernández Yáñez
Sielelementonoestá,nosquedamossinsublista:ini > fin
13 > lista[mitad] ini = mitad + 1
13 < lista[mitad] fin = mitad – 1 2
¡¡¡ini > fin !!! Nohaydóndeseguirbuscando Noestá
Página 735Fundamentos de la programación: Algoritmos de ordenación
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
mitadmitadiniini finfin
5 7 12 14 14 15 18 20 27 32
0 1 2 3 4 5 6 7 8 9
iniinifinfin
mitadmitad
Parael13:
Luis Hernández Yáñez
Implementaciónint buscado;cout << "Valor a buscar: ";cin >> buscado;int ini = 0, fin = N – 1, mitad;bool encontrado = false;while ((ini <= fin) && !encontrado) {
mitad = (ini + fin) / 2; // División enteraif (buscado == lista[mitad]) {
encontrado = true;}else if (buscado < lista[mitad]) {
fin = mitad ‐ 1;}else {
ini = mitad + 1;}
} // Si se ha encontrado, está en [mitad]
Página 736Fundamentos de la programación: Algoritmos de ordenación
const int N = 10;typedef int tLista[N];tLista lista;
Luis Hernández Yáñez
#include <iostream>using namespace std;#include <fstream>
const int N = 100;typedef int tArray[N];typedef struct {
tArray elementos;int cont;
} tLista;
int buscar(tLista lista, int buscado);
int main() {tLista lista;ifstream archivo;int dato;lista.cont = 0;archivo.open("ordenados.txt"); // Existe y es correctoarchivo >> dato;...
Página 737Fundamentos de la programación: Algoritmos de ordenación
binaria.cppbinaria.cpp
Luis Hernández Yáñez
while ((lista.cont < N) && (dato != ‐1)) {lista.elementos[lista.cont] = dato;lista.cont++;archivo >> dato;
}archivo.close();for (int i = 0; i < lista.cont; i++) {
cout << lista.elementos[i] << " ";}cout << endl;int buscado, pos;cout << "Valor a buscar: ";cin >> buscado;pos = buscar(lista, buscado);if (pos != ‐1) {
cout << "Encontrado en la posición " << pos + 1 << endl;}else {
cout << "No encontrado!" << endl;} return 0;
} ...
Página 738Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
int buscar(tLista lista, int buscado) {int pos = ‐1, ini = 0, fin = lista.cont ‐ 1, mitad;bool encontrado = false;while ((ini <= fin) && !encontrado) {
mitad = (ini + fin) / 2; // División enteraif (buscado == lista.elementos[mitad]) {
encontrado = true;}else if (buscado < lista.elementos[mitad]) {
fin = mitad ‐ 1;}else {
ini = mitad + 1;}
}if (encontrado) {
pos = mitad;}return pos;
}
Página 739Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
Complejidad¿Quéordendecomplejidadtienelabúsquedabinaria?
Casopeor:
Noestáoseencuentraenunasublistade1elemento
Nºdecomparaciones=Nºdemitadesquepodemoshacer
N/2,N/4,N/8,N/16,...,8,4,2,1
1,2,4,8,...,N/16,N/8,N/4,N/2SihacemosqueNseaiguala2k:
20,21,22,23,...,2k‐4,2k‐3,2k‐2,2k‐1
Nºdeelementosdeesaserie:k
Nºdecomparaciones=k N=2k k=log2 N
Complejidad:O(log2 N) MuchomásrápidaqueO(N)
Página 740Fundamentos de la programación: Algoritmos de ordenación
Luis Hernández Yáñez
LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.
Estedocumentotieneestablecidaslassiguientes:
Pulsaenlaimagendearribaaladerechaparasabermás.
Fundamentos de la programación: Algoritmos de ordenación Página 741
Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.
Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.
Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.