fundamentos de la programación...

58
7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Fundamentos de la programación Luis Hernández Yáñez Fundamentos de la programación: Algoritmos de ordenación Algoritmos de ordenación 651 Algoritmo de ordenación por inserción 654 Ordenación de arrays por inserción 665 Algoritmo de ordenación por inserción con intercambios 672 Claves de ordenación 680 Estabilidad de la ordenación 688 Complejidad y eficiencia 692 Ordenaciones naturales 694 Ordenación por selección directa 701 Método de la burbuja 716 Listas ordenadas 722 Búsquedas en listas ordenadas 729 Búsqueda binaria 731

Upload: others

Post on 18-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 2: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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]

Page 3: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 4: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 5: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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:

Page 6: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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:

Page 7: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 8: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 9: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 10: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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;

Page 11: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 12: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 13: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 14: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 15: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 16: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 17: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 18: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 19: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 20: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 21: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 22: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 23: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 24: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 25: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 26: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 27: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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:

Page 28: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 29: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 30: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 31: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 32: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 33: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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;

Page 34: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 35: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 36: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 37: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 38: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 39: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 40: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 41: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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;

Page 42: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 43: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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!

Page 44: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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;

Page 45: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 46: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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

Page 47: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

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.

Page 48: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

7A

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 (Anexo)

Ordenación por intercambio 744Mezcla de dos listas ordenadas 747

Page 49: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Luis Hernández Yáñez

Página 744Fundamentos de la programación: Algoritmos de ordenación (Anexo)

Luis Hernández Yáñez

AlgoritmodeordenaciónporintercambioVariacióndelmétododeseleccióndirecta

Seintercambiaelelementodelaposiciónquesetrataencadamomentosiemprequeseencuentraunoqueesmenor:

Página 745Fundamentos de la programación: Algoritmos de ordenación (Anexo)

14 7 12 32 20 14 27 5 13 150 1 2 3 4 5 6 7 8 9

7 14 12 32 20 14 27 5 13 150 1 2 3 4 5 6 7 8 9

5 14 12 32 20 14 27 7 13 150 1 2 3 4 5 6 7 8 9

Page 50: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Luis Hernández Yáñez

const int N = 10;typedef int tLista[N];tLista lista;...for (int i = 0; i < N ‐ 1; i++) {// Desde el primer elemento hasta el penúltimo

for (int j = i + 1; j < N; j++) {// Desde i+1 hasta el final

if (lista[j] < lista[i]) {int tmp;tmp = lista[i];lista[i] = lista[j];lista[j] = tmp;

}

}

}

Igualnúmerodecomparaciones,muchosmásintercambiosNoesestable

Página 746Fundamentos de la programación: Algoritmos de ordenación (Anexo)

intercambio.cppintercambio.cppLuis Hernández Yáñez

Página 747Fundamentos de la programación: Algoritmos de ordenación (Anexo)

Page 51: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Luis Hernández Yáñez

Mezcladedoslistasordenadasenarraysconst int N = 100;typedef struct {int elementos[N];int cont;

} tLista;

Uníndiceparacadalista,inicializadosa0(principiodelaslistas)

Mientrasquenolleguemosalfinaldealgunadelasdoslistas:

Elegimoselelementomenordelosquetienenlosíndices

Locopiamosenlalistaresultadoyavanzamossuíndiceunaposición

Copiamosenlalistaresultadolosquequedenenlalistanoacabada

Página 748Fundamentos de la programación: Algoritmos de ordenación (Anexo)

Luis Hernández Yáñez

void mezcla(tLista lista1, tLista lista2, tLista &listaM) {int pos1 = 0, pos2 = 0;listaM.cont = 0;

while ((pos1 < lista1.cont) && (pos2 < lista2.cont)&& (listaM.cont < N)) {

if (lista1.elementos[pos1] < lista2.elementos[pos2]) {listaM.elementos[listaM.cont] = lista1.elementos[pos1];pos1++;

}else {

listaM.elementos[listaM.cont] = lista2.elementos[pos2];pos2++;

}listaM.cont++;

}...

Página 749Fundamentos de la programación: Algoritmos de ordenación (Anexo)

Page 52: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Luis Hernández Yáñez

// Pueden quedar datos en alguna de las listasif (pos1 < lista1.cont) {

while ((pos1 < lista1.cont) && (listaM.cont < N)) {listaM.elementos[listaM.cont] = lista1.elementos[pos1];pos1++;listaM.cont++;

}}else { // pos2 < lista2.cont

while ((pos2 < lista2.cont) && (listaM.cont < N)) {listaM.elementos[listaM.cont] = lista2.elementos[pos2];pos2++;listaM.cont++;

}}

}

Página 750Fundamentos de la programación: Algoritmos de ordenación (Anexo)

mezcla1.cppmezcla1.cppLuis Hernández Yáñez

Mezcladedoslistasordenadasenarchivosvoid mezcla(string nombre1, string nombre2, string nombreM) {// Mezcla las secuencias en los archivos nombnre1 y nombre2// generando la secuencia mezclada en el archivo nombreM

ifstream archivo1, archivo2;ofstream mezcla;int dato1, dato2;

// Los archivos existen y son correctosarchivo1.open(nombre1.c_str());archivo2.open(nombre2.c_str());mezcla.open(nombreM.c_str());archivo1 >> dato1;archivo2 >> dato2;while ((dato1 != ‐1) && (dato2 != ‐1)) {// Mientras quede algo en ambos archivos

...

Página 751Fundamentos de la programación: Algoritmos de ordenación (Anexo)

Page 53: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Luis Hernández Yáñez

if (dato1 < dato2) {mezcla << dato1 << endl;archivo1 >> dato1;

} else {mezcla << dato2 << endl;archivo2 >> dato2;

}} // Uno de los dos archivos se ha acabadoif (dato1 != ‐1) { // Quedan en el primer archivo

while (dato1 != ‐1) {mezcla << dato1 << endl;archivo1 >> dato1;

}}else { // Quedan en el segundo archivo

while (dato2 != ‐1) {mezcla << dato2 << endl;archivo2 >> dato2;

}}...

Página 752Fundamentos de la programación: Algoritmos de ordenación (Anexo)

Luis Hernández Yáñez

archivo2.close();archivo1.close();mezcla << ‐1 << endl;mezcla.close();

}

Página 753Fundamentos de la programación: Algoritmos de ordenación (Anexo)

mezcla2.cppmezcla2.cpp

Page 54: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Luis Hernández Yáñez

LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.

Estedocumentotieneestablecidaslassiguientes:

Pulsaenlaimagendearribaaladerechaparasabermás.

Fundamentos de la programación: Algoritmos de ordenación (Anexo) Página 754

Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.

Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.

Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.

Page 55: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Fundamentos de la programación    Ejercicios del Tema 7  —  Pág. 1 

Facultad de Informática – Universidad Complutense 

Fundamentos de la programación Curso 2013–2014 

HojadeejerciciosdelTema7

1. Utilizando las estructuras de datos definidas en el ejercicio 5 de la hoja deejerciciosdelTema5(empleadosdeunaempresa),ordenalalistasegúneltipode contratación de los empleados (Fijo, En prácticas, Eventual o Becario)utilizandolostresalgoritmosdeordenaciónvistosenclase:

a) Ordenaciónporinserción

b) Ordenaciónporseleccióndirecta

c) Métododelaburbuja

2. Enunarchivode textoinventario.txt seguarda informaciónacercade losproductos existentes en un almacén. Para cada producto se guardan lossiguientesdatos:

Códigodelproducto(enteropositivo)

Nombredelproducto

Númerodeunidades(entero)

Precioporunidad(real)

Elarchivoestáordenadoporordencrecientedelcódigodeproductoyterminaconun‐1comocódigo.

Se dispone además de otro archivo, modificaciones.txt, en el que seguardanlasmodificacionesenelnúmerodeartículosquesehanproducidoalolargo de todo un día. Cada componente del archivo modificaciones.txtconstadelossiguientescampos:

Códigodelproducto(enteropositivo)

Códigodeoperación:venta(V),compra(C),odevolución(D)

Númerodeunidades(entero)

El archivo modificaciones.txt está organizado secuencialmente y no seencuentra ordenado de ninguna manera especial. Puede haber variasmodificaciones relativas al mismo producto. Es decir, el producto de código2331 puede tener asociadas, por ejemplo, tres componentes del archivomodificaciones.txt: la primera puede tratarse de la devolución de 100unidades,lasegundadeladevoluciónde50unidadesylaterceradelaventade550unidades.Terminaconun‐1comocódigo.

Page 56: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Fundamentos de la programación    Ejercicios del Tema 7  —  Pág. 2 

Sepide:

a) Efectuarlasdeclaracionesnecesarias.

b) Implementarunsubprogramaquecoloquelainformacióndelarchivoinventario.txtenlasestructurasdedatoscorrespondientes.

c) Implementarunsubprogramaqueguardeenunarchivoinventario2.txtlainformacióncontenidaenlalistadelinventario.

d) Implementarunsubprogramaquedadouncódigodeproductodevuelvasuposiciónenlalistadelinventario.Deberealizarunabúsquedabinaria.

e) Implementarunsubprogramaqueactualicelalistadelinventarioprocesandoloscambiosdelarchivomodificaciones.txt(lasventasdisminuyenelnúmerodeunidadesylascomprasydevolucionesloaumentan).

3. Se quiere implementar una aplicación para gestionar la información de lasobraspictóricascatalogadasenelmuseodelPradodeMadrid.Elnúmerototalde obras del museo no puede superar un cierto valor máximo N, siendo elnúmerodeobrasexistentesencadamomentovariable.La informaciónquesequierealmacenarparacadaobraconsisteen:

Númerodecatálogo(enteropositivo)

Títulodelaobra(cadena)

Nombredelpintor(cadena)

Escueladelpintor(Española,Flamenca,Italiana,Francesa,Holandesa,AlemanaoInglesa).

Lasobrassemantendránordenadasporelnúmerodecatálogo.

Sepide:

a) Redactarlasdeclaracionesadecuadas.

b) Implementarunsubprogramaquecargueenlalistalainformacióndeunarchivodetextomuseo.txtsobreobraspictóricasordenadaspornúmerodecatálogo.Paracadaobra,elarchivocontienecuatrolíneas,queindican,enesteorden,elnúmerodecatálogo,eltítulo,elnombredelpintorylaescuela.Terminacon‐1comonúmerodecatálogo.

c) Implementarunsubprogramaque,dadosunalistadeobrasyelnúmerodecatálogodeunaobra,eliminedelalistalaobracondichonúmerodecatálogo,siesqueexiste,ydevuelvaunvalorqueindiquesilaoperaciónhatenidoéxito.Suponerquelalistadeobrasestáordenadaenordencrecienteporelnúmerodecatálogoyquenoexistennúmerosdecatálogorepetidos.Silaoperacióntieneéxito(sesuprimelaobra):Nodebenquedar“huecos”enlalista.

Page 57: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Fundamentos de la programación    Ejercicios del Tema 7  —  Pág. 3 

4. [Controldeabrilde2012]Sepideconstruirunprogramaqueproceseelstockdeuna tienda. El stock es una lista de longitud variable de productos (máximo100).Paracadaproductosemantienelasiguienteinformación:

Código(enteropositivo)

Nombre(unasolapalabra)

Precio(real)

Unidades(enteropositivo)

El programa comenzará leyendo la información del stock de un archivostock.txt. El archivo contiene cuatro líneas por producto (código, nombre,precio y unidades). Termina con un ‐1 como código.Hay que comprobar queexistaysihaymásdelmáximodeproductos,seignoraránlosadicionales.

A continuación, el programa mostrará la lista de productos y calculará ymostraráelactivototaldelatienda(elactivodeunproductoessuprecioporsunúmero de unidades; el activo total es la suma de los activos de todos losproductos).Seguiráordenandolalistapornombresdeproductosyfinalmentevolveráamostrarlalista.

Lalistasemostraráconunformatocomoelsiguiente:

   123 TV_PLASMA_32"                  457.95 €   4 unidades 

  4265 TV_LED_38"                     379.95 €  12 unidades 

 43256 DVD_GRABADOR_250_Gb            255.00 €   8 unidades 

   672 TABLET_10"_HD_WiFi_3G          428.50 €   5 unidades 

(Anchurade6yajusteaderechaparaelcódigo,anchurade30yajusteaizquierdaparaelnombre,anchura de 8 y dos decimales para el precio, anchura de 3 y ajuste a derecha para el número deunidades.)

Se desarrollarán, al menos, los siguientes subprogramas: leer stock, activo(activototaldelatienda),ordenar,mostrarproducto(líneaconlainformacióndelproductoproporcionado)ymostrarstock.

5. [Controldeabrilde2013]Sepideconstruirunprogramaquemuestreporordendefechalosalquileresdeunaagenciadealquilerdecoches.Sedisponededosarchivos,uno(coches.txt)conlainformacióndecódigos(enteros)ynombres(cadenas)deloscochesdelosquesedispone.Lainformaciónenelarchivoestáordenadaporcódigosyterminacon‐1comocódigo:

1325 Seat León 1548 Volkswagen Golf ... ‐1 El otro archivo (rent.txt) contiene (sin ningún orden) la relación dealquileres que se han contratado (código del coche, fecha en formatoAA/MM/DDydíasquesehaalquilado).Terminaconun‐1comocódigo:

 

Page 58: Fundamentos de la programación 7olimpiadas.informatica.ucm.es/files/fp/07-AlgoritmosDeOrdenacion.pdf · 125.40 76.95 328.80 254.62 435.00 164.29 316.05 219.99 93.45 756.62 0123456789

Fundamentos de la programación    Ejercicios del Tema 7  —  Pág. 4 

7377 13/03/19 1 2176 13/02/11 7 6664 13/03/17 3 3349 13/01/21 1 ... ‐1 El programa deberá empezar cargando la información de cada archivo ensendaslistas:unalistadecoches(máximo20)yunalistadealquileres(máximo100). La lista de coches quedará ordenada por orden de códigos (como en elarchivo).

Una vez leídas las listas ordenará la lista de alquileres por fechas. Terminarámostrandolainformaciónsobrelosalquileres(fecha,modeloydíasalquilado):

13/01/17 Volkswagen Golf         3 día(s) 13/01/21 Opel Zafira             1 día(s) 13/01/31 Opel Vivaro             3 día(s) ... 13/02/26 Volkswagen Passat       3 día(s) 13/02/27 ERROR: ¡¡¡Modelo inexistente!!! ... 

Elprogramadeberáhacerusodelossiguientessubprogramas:

leerModelos():cargalainformacióndelarchivocoches.txtenlalistadecoches;devuelvetruesisehapodidoabrirelarchivoyfalseencasocontrario. La lista de coches sólo contendrá la información de estearchivo.

leerAlquileres(): carga la información del archivo rent.txt en lalistadealquileres;devuelvetruesisehapodidoabrirelarchivoyfalseencasocontrario.Lalistadealquileressólocontendrálainformacióndeestearchivo.

ordenar(): ordena la lista de alquileres por orden de fecha (menor amayor).

buscar(): dada la lista de coches y un código, devuelve la posición(índice) del elemento de la lista de coches con ese código; si no seencuentra el código devuelve ‐1. Debe implementarse como búsquedabinaria.

mostrar():dadasambaslistas,muestralarelacióndealquileresconelformato mostrado arriba; si no se encuentra un código de coche senotificaráelerror.