Fundamentos de la programación 7...Fundamentos de programación: Algoritmos de ordenación Página...

32
28/03/2014 1 Fundamentos de la programación 7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Facultad de Informática Universidad Complutense Luis Hernández Yáñez Página 1 Fundamentos de la programación: Algoritmos de ordenación Algoritmos de ordenación 2 Ordenación por inserción 4 Versión optimizada 12 Claves de ordenación 15 Estabilidad de la ordenación 21 Casos de estudio (naturalidad) 24 Complejidad y eficiencia 25 Ordenación por selección 30 Método de la burbuja 34 Versión optimizada 38 Búsqueda secuencial 40 Búsqueda binaria 42 Órdenes de complejidad 51 Inserción y eliminación en listas ordenadas 52 Mezcla de listas ordenadas 57

Transcript of Fundamentos de la programación 7...Fundamentos de programación: Algoritmos de ordenación Página...

  • 28/03/2014

    1

    Fundamentos de la programación

    7GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware

    GradoenIngenieríadeComputadores

    FacultaddeInformáticaUniversidadComplutense

    Luis He

    rnánde

    z Yáñez

    Página 1Fundamentos de la programación: Algoritmos de ordenación

    Algoritmos de ordenación 2Ordenación por inserción 4

    Versión optimizada 12Claves de ordenación 15Estabilidad de la ordenación 21Casos de estudio (naturalidad) 24Complejidad y eficiencia 25

    Ordenación por selección 30Método de la burbuja 34

    Versión optimizada 38 Búsqueda secuencial 40Búsqueda binaria 42Órdenes de complejidad 51Inserción y eliminación en listas ordenadas 52Mezcla de listas ordenadas 57

  • 28/03/2014

    2

    Luis He

    rnánde

    z Yáñez

    Ordenacióndelistas

    Tareamuyhabitual:paramostrarlosdatosenordenoparafacilitarlasbúsquedas.Variadasformasdehacerlo(algoritmos),conmayoromenorrapidez.

    Página 2Fundamentos de programación: Algoritmos de ordenación

    array125.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

    array76.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(menoramayor)

    Algoritmodeordenación(menoramayor)

    array[i] 

  • 28/03/2014

    3

    Luis He

    rnánde

    z Yáñez

    OrdenacióndearraysporinserciónElarraycontieneinicialmentelalistadesordenada:

    Amedidaquevayamosinsertandoloselementosensulugar,unapartedelarraycorresponderáalalistaordenadayelrestoaloselementosquetodavíaquedanporprocesar.

    Página 4Fundamentos de programación: Algoritmos de ordenación

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

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

    ParteyaordenadaParteyaordenada ElementosporinsertarElementosporinsertar

    SiguienteelementoainsertarSiguienteelementoainsertar

    Luis He

    rnánde

    z Yáñez

    OrdenacióndearraysporinserciónSituacióninicial:Listaordenadaconunsoloelemento.Elprimerodelarray:

    Desdeelsegundoelementohastaelúltimo:

    Insertamoselelementoenlaparteordenada

    Localizamoslaposicióndelprimerelementoestrictamentemayor…

    Página 5Fundamentos de programación: Algoritmos de ordenación

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

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

    ÚltimoelementodelaparteordenadaÚltimoelementodelaparteordenada7elementoelemento

  • 28/03/2014

    4

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserción… Desplazamosunaposiciónaladerechatodoslosestrictamentemayores.

    Ycolocamoselelementoencursoenlaposiciónquequedalibre.

    Página 6Fundamentos de programación: Algoritmos de ordenación

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

    7elementoelemento

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

    7elementoelemento

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserciónconst int N = 10;typedef double tLista[N];tLista lista;double elemento;...for (int i = 1; i  primer elemento mayorfor (int j = i; j > pos; j‐‐) lista[j] = lista[j‐1];lista[pos] = elemento;

    }}

    Página 7Fundamentos de programación: Algoritmos de ordenación

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

  • 28/03/2014

    5

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserción

    Página 8Fundamentos de programación: Algoritmos de ordenación

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

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

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

    7elementoelemento0pospos1ii

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

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserción

    Página 9Fundamentos de programación: Algoritmos de ordenación

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

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

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

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

    5elementoelemento0pospos4ii

  • 28/03/2014

    6

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserción

    Página 10Fundamentos de programación: Algoritmos de ordenación

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

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

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

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

    14elementoelemento3pospos5ii

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserción(versiónoptimizada)Lainsercióndecadaelementoensuposiciónadecuadasepuedellevaracabomedianteunaseriedecomparacioneseintercambios:

    Desdeelsegundoelementohastaelúltimo: Obtenerelelemento Buscamoselprimerdatomenoroigual,explorandolazonayaordenadadederechaaizquierda,abriendohuecoalmismotiempo

    Página 11Fundamentos de programación: Algoritmos de ordenación

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

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

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

    15elementoelemento

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

  • 28/03/2014

    7

    Luis He

    rnánde

    z Yáñez

    Ordenacióndearraysporinserción(versiónoptimizada)const int N = 10;typedef double tLista[N];tLista lista;...for (int i = 1; i =1bool enc = lista[pos]  0) && !enc) {lista[pos+1] = lista[pos];pos‐‐;enc = lista[pos] 

  • 28/03/2014

    8

    Luis He

    rnánde

    z Yáñez

    ...ordenarInsercion(lista); 

    cout

  • 28/03/2014

    9

    Luis He

    rnánde

    z Yáñez

    ClavesdeordenaciónPodemoscrearunafunciónparaeloperadorrelacional:bool operator>(tDato opIzq, tDato opDer) {return opIzq.nombre > opDer.nombre;

    }

    Enelmétododeinserción“estándar”if(lista[pos] > elemento) enc= true;else pos++;

    Enelmétododeinserciónoptimizadoenc = !(lista[pos] > elemento); //a≤b ↔ !(a>b)

    Página 16Fundamentos de programación: Algoritmos de ordenación

    tDato elemento;

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

    Luis He

    rnánde

    z Yáñez

    Clavesdeordenación#include #include #include using namespace std;#include const int N = 100;typedef struct {int codigo;string nombre;double sueldo;

    } tDato;typedef struct {tDato datos[N];int cont;

    } tLista;

    void ordenarInsercion(tLista& lista);bool operator>(const tDato& opIzq, const tDato& opDer);void mostrar(const tLista& lista);void cargar(ifstream& ent, tLista& lista);

    Página 17Fundamentos de programación: Algoritmos de ordenación

  • 28/03/2014

    10

    Luis He

    rnánde

    z Yáñez

    int main() {tLista lista;lista.cont = 0;ifstream archivo;archivo.open("datos.txt");if (!archivo.is_open()) {cout 

  • 28/03/2014

    11

    Luis He

    rnánde

    z Yáñez

    ...

    void mostrar(const tLista& lista) {for (int i = 0; i 

  • 28/03/2014

    12

    Luis He

    rnánde

    z Yáñez

    EstabilidaddelaordenaciónSiahoraordenamosporelcampoCodigo:

    Página 22Fundamentos de programación: Algoritmos de ordenación

    10000   Sergei        10000010000   Hernández     15000011111   Benítez       10000011111   Urpiano 9000011111   Pérez          9000011111   Durán         12000012345   Alvarez 12000012345   Gómez         10000012345   Sánchez        9000012345   Turégano 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   Alvarez 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 He

    rnánde

    z Yáñez

    EstabilidaddelaordenaciónLosdosmétodosdeordenaciónporinserciónquehemosvistosonestables.Nolosonseríansiusáramoslassiguientescomparaciones:

    Enelmétododeinserción“estándar”if(lista[pos] >= elemento) enc= true;else pos++;

    Enelmétododeinserciónoptimizadoenc = lista[pos] 

  • 28/03/2014

    13

    Luis He

    rnánde

    z Yáñez

    Casosdeestudio Listainicialmenteordenada. Listainicialmenteinversamenteordenada. Listacondisposiciónaleatoria¿Trabajamenos,másoiguallaordenaciónencadacaso?Sielalgoritmodeordenacióntrabajamenoscuantomásordenadaestáinicialmentelalista,sedicequelaordenaciónesnatural.Ordenaciónporinserciónconlalistainicialmenteordenada: Versiónestándar:

    Seahorralosdesplazamientos,perohaceelmáximonúmerodecomparaciones.Nonatural.

    Versiónoptimizada:Trabajamuchomenos,yaquebastaunacomparacióncadavez.Natural.

    Página 24Fundamentos de programación: Algoritmos de ordenación

    Luis He

    rnánde

    z Yáñez

    ComplejidadyeficienciaMidelacantidadderecursosentiempo(yespacio)quenecesitaunalgoritmopararesolverunproblema.Lacomplejidadalgorítmicanoproporcionanmedidasabsolutassinomedidasrelativasaltamañodelproblema.

    Eltiempo(medidoenpasos)requeridoporunalgoritmoenfuncióndeltamañodelosdatos:T(N)Contaremoslasoperacionesquerealizaelalgoritmoenbasealadimensióndelalistaaordenar.Enestecaso: Comparaciones AsignacionesencomponentesdelarrayAsumimosqueambasrequierenuntiemposimilar.

    Página 25Fundamentos de programación: Algoritmos de ordenación

  • 28/03/2014

    14

    Luis He

    rnánde

    z Yáñez

    ComplejidadyeficienciaOrdenaciónporinserciónoptimizada:...for (int i = 1; i =1bool enc = lista[pos]  0) && !enc) {

    lista[pos+1] = lista[pos];pos‐‐;enc = lista[pos] 

  • 28/03/2014

    15

    Luis He

    rnánde

    z Yáñez

    ComplejidadyeficienciaOrdenaciónporinserciónoptimizada: Casomejor:listainicialmenteordenada

    Laprimeracomparaciónfallaynoserealizaningúnintercambio.T(N)=(N‐1)*(1comparación+1asignación)

    Casopeor:listainicialmenteordenadaalrevésParacadapos,entrei‐1y1,serealiza1asignacióny1comparación.Además1comparaciónantesy2asignacionesdespués

    Página 28Fundamentos de programación: Algoritmos de ordenación

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

    Luis He

    rnánde

    z Yáñez

    ComplejidadyeficienciaOrdenaciónporinserción(optimizada): Casomejor:T(N)=2N‐ 2

    SedicequetienecomplejidadlinealT(N)O(N)

    Casopeor:T(N)=N2 ‐ 1SedicequetienecomplejidadcuadráticaT(N)O(N2)

    Casomedio(distribuciónaleatoriadeloselementos)T(N)O(N2)

    Hayalgoritmosdeordenaciónmejores!

    Página 29Fundamentos de programación: Algoritmos de ordenación

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

  • 28/03/2014

    16

    Luis He

    rnánde

    z Yáñez

    Algoritmodeordenaciónporseleccióndirecta

    Desdelaprimeraposición,i =0,hastalapenúltima(N‐2): Calcularm: posiciónconelmenorelementoen[i..(N‐1)] Intercambiarelelementodelaposicióni coneldelaposiciónm

    Página 30Fundamentos de programación: Algoritmos de ordenación

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

    mmii

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

    mmiiSólointercambiamossinoeslamismaposiciónSólointercambiamossinoeslamismaposición

    Luis He

    rnánde

    z Yáñez

    Algoritmodeordenaciónporseleccióndirecta

    Página 31Fundamentos de programación: Algoritmos de ordenación

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

    mmii

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

    mmii

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

    mmii

  • 28/03/2014

    17

    Luis He

    rnánde

    z Yáñez

    Algoritmodeordenaciónporseleccióndirectaconst int N = 10;typedef double tLista[N];tLista lista;double tmp;...for (int i = 0; i 

  • 28/03/2014

    18

    Luis He

    rnánde

    z Yáñez

    AlgoritmodeordenaciónporelmétododelaburbujaEsunavariacióndelmétododeseleccióndirecta.Elelementomenorvasubiendohastaalcanzarsuposicióndefinitiva,comounaburbujaenelaguasubehacialasuperficie.

    Página 34Fundamentos de 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 He

    rnánde

    z Yáñez

    Página 35Fundamentos de programación: Algoritmos de ordenación

    12 32 14 5 14 70 1 2 3 4 5

    12 32 14 5 7 140 1 2 3 4 5

    12 32 14 5 7 140 1 2 3 4 5

    12 32 5 14 7 140 1 2 3 4 5

    12 5 32 14 7 140 1 2 3 4 5

    5 12 32 14 7 140 1 2 3 4 5

  • 28/03/2014

    19

    Luis He

    rnánde

    z Yáñez

    AlgoritmodeordenaciónporelmétododelaburbujaDesdelaprimeraposición,i =0,hastalapenúltima(N‐2):Desdelaúltimaposición ,j =N‐1,hastai+1 hacer:Sielelementoenj esmenorqueelelementoenj‐1,intercambiarlos

    const int N = 10;typedef double tLista[N];tLista lista;double tmp;...for (int i = 0; i  i; j‐‐)// Desde el último hasta el siguiente a iif (lista[j] 

  • 28/03/2014

    20

    Luis He

    rnánde

    z Yáñez

    Métododelaburbujamejoradoconst int N = 10;typedef double tLista[N];tLista lista;bool subirBurbuja( int i, tLista& lista);// Sube la burbuja en lista[i+1..N‐1]// i

  • 28/03/2014

    21

    Luis He

    rnánde

    z Yáñez

    BúsquedasecuencialEnlassecuenciasnoordenadasbuscamosrecorriendohastaqueencontremoselelementoolleguemosalfinal.Silasecuenciaolistaestáordenadapodemospararantesdellegaralfinalenelcasodequeelelementonoesté.

    Si,porejemplo,buscamosel17,alllegaral20yasabremosquenoestá,puesacontinuacióntodoslosvaloresson>=20y,porlotanto>17.

    Consecuencia:setratadebuscarelprimerelementodelalistaqueseamayoroigualqueeldatoquesebusca.

    Página 40Fundamentos de programación: Algoritmos de ordenación

    5 7 12 13 14 14 15 20 27 320 1 2 3 4 5 6 7 8 9

    Luis He

    rnánde

    z Yáñez

    Búsquedasecuencialconst int N = 10;typedef double tLista[N];tLista lista; // lista ordenada double buscado;  

    int i = 0; bool encontrado = false;

    // Búsqueda asimétricawhile ((i = buscado) encontrado = true; else i++;

    }

    // CASOS:// encontrado && (lista[i] == buscado): Encontrado en la posición i // encontrado && (lista[i] > buscado):  No encontrado, //                            debería estar justo antes que lista[i]// !encontrado: No encontrado, debería estar detrás de todos

    if(encontrado && (lista[i] == buscado)) { // Encontrado!!... 

    }

    Página 41Fundamentos de programación: Algoritmos de ordenación

    ComplejidadlinealO(N)

    Invariante:lista[0 … i‐1] 

  • 28/03/2014

    22

    Luis He

    rnánde

    z Yáñez

    BúsquedabinariaUnaformamuchomásrápidadebuscarqueaprovechalaordenación.Comparamosconelvalorqueestéenelmediodelalista.

    Sieselquebuscamos,terminamos. Sino,buscamosenlaprimeramitaddelalistasieseelementoesmayorqueelquebuscamosyenlasegundamitadencasocontrario.

    Repetimoselprocesohastaencontrarlooquedarnossinsublista.

    Página 42Fundamentos de programación: Algoritmos de ordenación

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    Sibuscamosel12:

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    Luis He

    rnánde

    z Yáñez

    BúsquedabinariaVamosbuscandoensublistascadavezmáspequeñas.Debemoslimitarelsegmentodelalistadondeestamosbuscando.Inicialmentetenemostodalalista:

    Elíndicedelelementoenlamitades:mitad = (ini + fin) / 2Sinosehaencontrado,¿dóndehayquebuscaracontinuación? Sielbuscadoesmenorqueelqueestáenlamitad:fin = mitad ‐ 1 Sielbuscadoesmayorqueelqueestáenlamitad:ini = mitad + 1

    Página 43Fundamentos de programación: Algoritmos de ordenación

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    iniini finfinmitadmitad

  • 28/03/2014

    23

    Luis He

    rnánde

    z Yáñez

    Búsquedabinaria

    12  lista[mitad]  ini = mitad + 1

    Página 44Fundamentos de programación: Algoritmos de ordenación

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    iniini finfinmitadmitad

    Buscamosel12

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    iniini finfinmitadmitad

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    iniini finfin

    mitadmitad ¡Encontrado!

    Luis He

    rnánde

    z Yáñez

    BúsquedabinariaSielelementonoestá,acabaremosquedándonossinsublista:ini > fin

    13 > lista[mitad]  ini = mitad + 1

    13  fin !!! Nohayyadóndeseguirbuscando Noestá.Página 45Fundamentos de programación: Algoritmos de ordenación

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    mitadmitadiniini finfin

    5 7 12 14 14 15 18 20 27 320 1 2 3 4 5 6 7 8 9

    iniinifinfin

    mitadmitad

    Parael13:

  • 28/03/2014

    24

    Luis He

    rnánde

    z Yáñez

    Búsquedabinariaconst int N = 10;typedef double tLista[N];tLista lista;...double buscado;cout  buscado;int ini = 0, fin = N – 1, mitad;bool encontrado = false;while ((ini 

  • 28/03/2014

    25

    Luis He

    rnánde

    z Yáñez

    ...int dato;while (archivo >> dato) {lista.elementos[lista.cont] = dato;lista.cont++;

    }for (int i = 0; i 

  • 28/03/2014

    26

    Luis He

    rnánde

    z Yáñez

    Búsquedabinaria¿Quéordendecomplejidadtiene?Casopeor:Elelementonoestáenlalistaoseencuentraensublistade1elemento.Nºdecomparaciones=Nºdevueltasqueseejecutaelwhile

    =NºdevecesquevisitamoselíndicemitadparapartirlasublistaN → N 2 → N 4 → N 8 →… → 4 → 2 → 1 →

    0 Fallo!Éxito!

    Elnúmerodevueltasenelpeorcasoeselnúmerodeflechas→SihacemosqueNseaiguala2k,esaseriequedacomo:

    2 → 2 → 2 → 2 →… → 2 → 2 → 2 → 0 Fallo!Éxito!Entotalk+1vueltas:

    Complejidadlogarítmica:T(N) O(log2 N)

    Página 50Fundamentos de programación: Algoritmos de ordenación

    N=2k T(N)=1+log2 N

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

    Luis He

    rnánde

    z 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 51Fundamentos de programación: Algoritmos de ordenación

  • 28/03/2014

    27

    Luis He

    rnánde

    z Yáñez

    InsercionesyeliminacionesenlistasordenadasHayqueinsertardeformaquelalistasigaordenada:

    Buscarellugar,desplazarlossiguientesaladerechaycolocar.Aleliminarnohayquedejarhuecos.Porejemplo,insertamosel10:

    Página 52Fundamentos de programación: Algoritmos de ordenación

    5 7 12 14 14 15 18 20 270 1 2 3 4 5 6 7 8 9

    5 7 12 14 14 15 18 20 270 1 2 3 4 5 6 7 8 9

    5 7 10 12 14 14 15 18 20 270 1 2 3 4 5 6 7 8 9

    ¡Errorsilalistaestállena!¡Errorsilalistaestállena!

    Luis He

    rnánde

    z Yáñez

    InsercionesyeliminacionesenlistasordenadasPorejemplo,eliminamosel7(el2º):

    Página 53Fundamentos de programación: Algoritmos de ordenación

    5 10 12 14 14 15 18 20 270 1 2 3 4 5 6 7 8 9

    5 7 10 12 14 14 15 18 20 270 1 2 3 4 5 6 7 8 9

    5 10 12 14 14 15 18 20 270 1 2 3 4 5 6 7 8 9

    ¡Errorsilaposiciónnoesválida!¡Errorsilaposiciónnoesválida!

  • 28/03/2014

    28

    Luis He

    rnánde

    z Yáñez

    GestióndeunatabladedatosordenadaTeproporcionamosunejemplobastantecompletodegestióndeunatabladedatosordenadaporuncamponombre:const int N = 100;typedef struct {int codigo;string nombre;double sueldo;

    } tRegistro;

    typedef tRegistro tLista[N];

    typedef struct {tLista registros;int cont;

    } tTabla;

    Página 54Fundamentos de programación: Algoritmos de ordenación

    tabla.cpp

    Luis He

    rnánde

    z Yáñez

    GestióndeunatabladedatosordenadaIncluyeestossubprogramas:void mostrarDato(int pos, tRegistro registro);// Línea con los datos del registro precedidos de su posiciónvoid mostrar(const tTabla& tabla);bool operator>(tRegistro opIzq, tRegistro opDer);bool operator

  • 28/03/2014

    29

    Luis He

    rnánde

    z Yáñez

    Página 56Fundamentos de programación: Algoritmos de ordenación

    Luis He

    rnánde

    z Yáñez

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

    } tLista;

    Uníndiceparacadalista,inicializadosa0(principiodelaslistas).

    Página 57Fundamentos de programación: Algoritmos de ordenación

    Mientrasquenolleguemosalfinaldealgunadelasdoslistas:• Elegimoselelementomenordelosquetienenesosíndices.• Locopiamosenlalistaresultadoyavanzamoseseíndiceunaposición.

    Copiamoslosquequedenenlalistaquenosehayaacabadoenlalistaresultado.

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

  • 28/03/2014

    30

    Luis He

    rnánde

    z Yáñez

    Mezcladedoslistasordenadasenarrays

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

    // buscamos el N‐ésimo dato introducido en listaMwhile ((pos1 

  • 28/03/2014

    31

    Luis He

    rnánde

    z Yáñez

    Mezcladedoslistasordenadasenarchivosbool mezcla(string nombre1, string nombre2, string nombreM) {// Mezcla las secuencias en los archivos nombre1 y nombre2// generando la secuencia mezclada en el archivo nombreMifstream archivo1, archivo2;ofstream mezcla;bool ok = true;archivo1.open(nombre1.c_str());if (!archivo1.is_open())ok = false;

    else {archivo2.open(nombre2.c_str());if (!archivo2.is_open())ok = false;

    else { // Ambos archivos existenmezcla.open(nombreM.c_str());int dato1, dato2;bool eof1, eof2;eof1 = !(archivo1 >> dato1);eof2 = !(archivo2 >> dato2); ...

    Página 60Fundamentos de programación: Algoritmos de ordenación

    Pedro J. Martín

     de la Calle

    Pedro J. Martín

     de la Calle

    Luis He

    rnánde

    z Yáñez

    Mezcladedoslistasordenadasenarchivos...   while (!eof1 && !eof2) { // Recorrido: 

    if (dato1 

  • 28/03/2014

    32

    Luis He

    rnánde

    z Yáñez

    ProgramaciónenC++paraingenierosF.Xhafa etal.Thomson,2006

    EllenguajedeprogramaciónC++ (Ediciónespecial)B.Stroustrup.Addison‐Wesley,2002

    Fundamentos de programación: Algoritmos de ordenación Página 62

    Luis He

    rnánde

    z Yáñez

    LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.Estedocumentotieneestablecidaslassiguientes:

    Pulsaenlaimagendearribaaladerechaparasabermás.

    Fundamentos de programación: Algoritmos de ordenación Página 63

    Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.