tema 5. arrays #ipg2murjc

186
Introducción a la programación Tema 5. Arrays Curso 2017/18 Apuntes generales de la asignatura (Isidoro Hernán) adaptados por Oriol Borrás Gené @oriolUPM

Upload: oriol-borras-gene

Post on 24-Jan-2018

2.694 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Tema 5. Arrays #IPG2MURJC

Introducción a la

programación

Tema 5. Arrays

Curso 2017/18

Apuntes generales de la asignatura (Isidoro Hernán) adaptados por Oriol Borrás Gené @oriolUPM

Page 2: Tema 5. Arrays #IPG2MURJC

Adaptado por Oriol Borrás Gené -

@oriolupm

Tema 5. Arrays

5.1. Definición de tipos y datos compuestos

5.2. Descripción de arrays

5.3. Operaciones con arrays

5.4. Arrays multidimensionales

5.5. Tipo string

5.6. Algoritmos con arrays

5.7. Unidades

Page 3: Tema 5. Arrays #IPG2MURJC

Objetivos

Adaptado por Oriol Borrás Gené @oriolupm

● Presentar los tipos compuestos de datos

● Conocer el tipo de dato array, cómo se define y las condiciones de

su aplicación.

● Conocer el tipo de dato string, cómo se define, las condiciones de

su aplicación y las principales funciones y procedimientos

predefinidos.

● Presentar algoritmos fundamentales de búsqueda y ordenación de

arrays.

● Conocer la declaración de unidades

Page 4: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos simples: son aquellos que cuyos valores representan un dato

atómico, es decir, indivisible. Los estudiados integer, char, real o

boolean; y nuevos tipos enumerado y subrango.

Datos compuestos: son aquellos cuyos valores pueden englobar a

varios datos simultáneamente: tipo conjunto (conjunto de letras de una

palabra), tipo array y tipo registro.

Page 5: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

● Los datos simples que puede definir el propio programador son el

enumerado y subrango.

● Son la base para construir los datos compuestos.

Page 6: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados (sintaxis):

TYPE

identificadorTipo = (listado de identificadores);

Ejemplos:

tDiasSemana = (lun, mar, mie, jue, vie, sab, dom);

thorarios = (manana, tarde, noche);

Page 7: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados (sintaxis):

Ejemplos:

TpokemonsAgua = (Squirtle, Wartortle, Blastoise, Psyduck,

Golduck, Poliwag, Poliwhirl, Seel, Shellder, Krabby, Kingler,

Horsea, Seadra, Goldeen, Seaking, Staryu, Magikarp, Vaporeon,

Totodile, Croconaw, Feraligatr, Marill, Azumarill, Politoed,

Remoraid, Octillery, Suicune, Mudkip, Wailmer, Wailord, Corphish,

Feebas, Milotic, Clamperl, Huntail, Gorebyss, Luvdisc, Kyogre,

Piplup, Prinplup, Buizel, Floatzel, Shellos, Finneon, Lumineon,

Phione, Manaphy, Oshawott, Dewott, Samurott, Panpour, Simipour,

Tympole, Basculin, Alomomola);

Page 8: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados

● Son tipos ordinales al igual que los tipos predefinidos integer, char

y boolean y los operadores relacionales son aplicables a los tipos

enumerados. Ejemplos:

lun < jue -> TRUE

lun = jue -> FALSE

succ (lun) -> mar

succ (lun) = pred (mie) -> TRUE

succ (dom) –> ERROR

ord (jue) -> 3

Page 9: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados (declaración de variables):

PROGRAM ejemplo;

TYPEtDiasSemana = (lun, mar, mie, jue, vie, sab, dom);

VARDias : tDiasSemana;

BEGIN

FOR Dias: lun TO dom DO

Page 10: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados (excepciones):

● Los valores de un tipo enumerado no se pueden escribir

directamente. Solución: Procedimiento con un case.

PROGRAM ejemplo;

TYPEtDiasSemana = (lun, mar, mie, jue, vie, sab, dom);

VARDias : tDiasSemana;

BEGINFOR Dias: lun TO dom DO

http://rextester.com/VKDE54087

Page 11: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados (excepciones):

● Los valores de un tipo enumerado no se pueden leer ni escribir

directamente. Solución: Procedimiento con un case (escribir) o

función que devuelva el valor leído.

PROCEDURE EscribirDiaSemana(dia: tDiasSemana);

BEGINcase dia oflun: WriteLn('Lunes');mar: WriteLn('Martes');

http://rextester.com/VKDE54087

Page 12: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos enumerados (excepciones):

● No se pueden repetir valores en diferentes definiciones de tipos

enumerados.

● Los valores de un tipo enumerado siempre son identificadores

Ejemplo:TYPE

tdias = (lun, mar, mie, jue, vie);

tdias2 = (vie, sab, dom);

Page 13: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos subrango (sintaxis):

● Intervalo de un dominio ordinal ya existente, bien de un tipo

predefinido, o bien de un tipo creado con anterioridad.

● Ord (constante 1)<= Ord (constante 2)

Page 14: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos subrango (sintaxis):

TYPE

tDias = 1 .. 31;tContador = 1 .. 20;tDiasSemana = 1 .. 7;

Page 15: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos subrango (sintaxis):

CONST MAXM = 10;MINM = 1;

TYPEtIndice = MINM .. MAXM;

Page 16: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Datos subrango (sintaxis):

TYPEtDiasSemana = (lun, mar, mie, jue, vie, sab, dom);tLaborables = lun .. Vie;

Page 17: Tema 5. Arrays #IPG2MURJC

5.1. Definición de tipos y datos compuestos

Adaptado por Oriol Borrás Gené @oriolupm

Orden (Encabezado):

1. Constantes

2. Tipos

3. Variables

4. Subprogramas

Page 18: Tema 5. Arrays #IPG2MURJC

5.2. Descripción de arrays

Adaptado por Oriol Borrás Gené @oriolupm

● Primera visión: un array es un tipo de dato estructurado que

permite almacenar la información de forma compacta y manejable.

VECTOR:

MATRIZ:

Page 19: Tema 5. Arrays #IPG2MURJC

5.2. Descripción de arrays

Adaptado por Oriol Borrás Gené @oriolupm

● Un array es una colección estructurada de componentes del

mismo tipo a las que se puede acceder de forma individual por su

posición dentro de la colección.

● Toda la colección de datos se almacena en un área de memoria

contigua bajo un solo nombre.

● Para acceder a cada componente individual se utilizan índices

que indican la posición de la componente dentro de la colección.

Page 20: Tema 5. Arrays #IPG2MURJC

5.2. Descripción de arrays

Adaptado por Oriol Borrás Gené @oriolupm

Ejemplo:

Array: elVector

El elemento que ocupa la segunda posición es el -2

Array: elTablero

El elemento que ocupa la tercera fila y la seguna

columna del array elTablero es el carácter ‘c’

Page 21: Tema 5. Arrays #IPG2MURJC

5.2. Descripción de arrays

Adaptado por Oriol Borrás Gené @oriolupm

● Un array es unidimensional si a cada componente se accede

mediante un único índice.

Ejemplo: [posición]

● Un array es bidimensional si a cada componente se accede

mediante 2 índices. Ejemplo:

[posFila, posColumna]

Page 22: Tema 5. Arrays #IPG2MURJC

5.2. Descripción de arrays

Adaptado por Oriol Borrás Gené @oriolupm

● Un array es multidimensional si a cada componente se accede

mediante más de un índice.

Ejemplo:

[pos1D, pos2D, pos3D]

Page 23: Tema 5. Arrays #IPG2MURJC

5.2.1. Declaración de arrays

Adaptado por Oriol Borrás Gené @oriolupm

Declaración de arrays (sintaxis):

ARRAY [listado de TipoIndices] OF Tipobase

Unidimensional: ARRAY [TipoIndice1] OF Tipobase

Multidimensional (2 opciones):

ARRAY [TipoIndice1, TipoIndice2, … TipoIndiceN] OF Tipobase

ARRAY [TipoIndice1] OF ARRAY [TipoIndice2] OF... ARRAY [TipoIndiceN] OF Tipobase

Tipo índice: expresa el rango de

los valores de los índices, debe

ser un Ordinal simple (integer,

char, boolean o definido por el

usuario).

Tipo base: tipo de las

componentes. Puede ser simple o

compuesto.

Page 24: Tema 5. Arrays #IPG2MURJC

5.2.1. Declaración de arrays

Adaptado por Oriol Borrás Gené @oriolupm

Declaración de arrays (ejemplos):

array [1..3] OF integer;

array [1..3, 1..3] OF integer;

array [1..4, 1..3, 1..3] OF integer;

Page 25: Tema 5. Arrays #IPG2MURJC

5.2.1. Declaración de arrays

Adaptado por Oriol Borrás Gené @oriolupm

● Un tipo de dato array se define en la sección de declaración de

tipos TYPE.

TYPETSubrango1 = 1..3;TSubrango2 = 1..4;TTipo1 = array [TSubrango1] OF integer;TTipo2 = array [TSubrango1,TSubrango1] OF char;TTipo3 = array [TSubrango2,TSubrango1,TSubrango1] OF integer;

VARvar1: TTipo1;var2: TTipo2;var3: TTipo3;

Page 26: Tema 5. Arrays #IPG2MURJC

Ejemplo 1

Adaptado por Oriol Borrás Gené @oriolupm

Definir mediante arrays un vector el vector:

u . v = u1v1 + u2v2 + u3v3

CONSTINI = 1;FIN = 3;

TYPETSubrango1 = INI..FIN;TVector3Elem = array [TSubrango1] OF real;

VARu,v: TVector3Elem; {con array}

{Dos alternativas}

u1,u2,u3,v1,v2,v3: real;

Page 27: Tema 5. Arrays #IPG2MURJC

5.2.1. Declaración de arrays

Adaptado por Oriol Borrás Gené @oriolupm

Se pueden declarar arrays anónimos:

VARtresReales: array [1..3] OF real;

(No pueden ser pasados como parámetros a subprogramas)

Los tipos anónimos no se les asigna un nombre type y se utilizan

cuando un tipo solo aparece una vez.

Page 28: Tema 5. Arrays #IPG2MURJC

5.2.2. Acceso

Adaptado por Oriol Borrás Gené @oriolupm

● En el acceso a un elemento del array se utilizan tantos índices

como dimensiones tenga dicho array.

● Para acceder a un elemento: se expresa el nombre de la variable

array y entre corchetes el o los valores de los índices del elemento

dentro del array.

Page 29: Tema 5. Arrays #IPG2MURJC

5.2.2. Descripción de un array

Adaptado por Oriol Borrás Gené @oriolupm

● Los arrays son estructuras de acceso directo, ya que permiten

almacenar y recuperar directamente los datos, especificando su

posición dentro de la estructura.

● Los arrays son estructuras de datos homogéneas: sus elementos

son TODOS del MISMO TIPO.

● El tamaño de un array se establece de forma FIJA, en un

programa, cuando se define una variable de este tipo.

Page 30: Tema 5. Arrays #IPG2MURJC

Ejemplo 2

Adaptado por Oriol Borrás Gené @oriolupm

El tipo de los índices puede ser cualquier ordinal. Por ejemplo un

índice de tipo enumerado:

TYPETDiasSemana = (Lun, Mar, Mie, Jue, Vie, Sab, Dom); TArrayDeDias = array [TDiasSemana] OF integer;

VARvisitasMuseo: TArrayDeDias;

BEGINvisitasMuseo[Lun]:= 58; visitasMuseo[Vie]:= 10;

Page 31: Tema 5. Arrays #IPG2MURJC

Ejemplo 3

Adaptado por Oriol Borrás Gené @oriolupm

Un índice puede ser el resultado de una expresión compatible con el

tipo de dicho índice. Ejemplo:

TYPETDiasSemana = (Lun, Mar, Mie, Jue, Vie, Sab, Dom); TArrayDeDias = array [TDiasSemana] OF integer;

VARdia: TDiasSemana;visitasMuseo, ingresoMuseo: TArrayDeDias;

BEGINdia := Lun;visitasMuseo[dia] := 58; visitasMuseo [succ(dia)] := 10;

END.

http://rextester.com/FKNC1721

Page 32: Tema 5. Arrays #IPG2MURJC

5.2.2. Descripción de un array

Adaptado por Oriol Borrás Gené @oriolupm

Almacenamiento de un array. Definición estática de variables:

Se reserva espacio de memoria, en posiciones contiguas, para el máximo de

componentes que puede acoger el array. Ejemplo: Memoria necesaria para

tresReales:

TYPE TSubrango1 = 1..3;T3Reales = array [TSubrango1] OF real;

VAR tresReales: T3Reales;

Si para un real se necesitan 4 bytes, para tresReales se reservan 4*3 = 12

bytes, en posiciones contiguas de memoria.

Page 33: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

● Asignación de un array.

● Operación de entrada de cada una de las componentes de un

array.

● Operación de salida de cada una de las componentes de un array.

● Como ocurre con todos los tipos compuestos, NO se pueden

realizar operaciones de entrada/salida con arrays completos.

Page 34: Tema 5. Arrays #IPG2MURJC

Ejemplo 4

Adaptado por Oriol Borrás Gené @oriolupm

Proceso de todas las componentes de un array:

TYPETDiasSemana = (Lun, Mar, Mie, Jue, Vie, Sab, Dom); TArrayDeDias = array [TDiasSemana] OF integer;

VARdia: TDiasSemana;visitasMuseo, ingresoMuseo: TArrayDeDias;

BEGIN…

FOR dia := Lun TO Dom DOvisitasMuseo[dia] := 0; {Inicializamos a 0 todas las componentes del array}

...END.

Page 35: Tema 5. Arrays #IPG2MURJC

Ejemplo 4 (alternativo)

Adaptado por Oriol Borrás Gené @oriolupm

Proceso de todas las componentes de un array:

TYPETDiasSemana = 1 .. 7; TArrayDeDias = array [TDiasSemana] OF integer;

VARdia: TDiasSemana;visitasMuseo, ingresoMuseo: TArrayDeDias;

BEGIN…

FOR dia := 1 TO 7 DOvisitasMuseo[dia] := 0; {Inicializamos a 0 todas las componentes del array}

...END.

Page 36: Tema 5. Arrays #IPG2MURJC

Ejemplo 5

Adaptado por Oriol Borrás Gené @oriolupm

Operación de entrada de las componentes de un array:

TYPETDiasSemana = (Lun, Mar, Mie, Jue, Vie, Sab, Dom); TArrayDeDias = array [TDiasSemana] OF integer;

VARdia: TDiasSemana;visitasMuseo, ingresoMuseo: TArrayDeDias;

BEGIN...FOR dia := Lun TO Dom DO

readln(visitasMuseo[dia]);readln(ingresoMuseo[Lun]);...

END.

http://rextester.com/EPG88628

Page 37: Tema 5. Arrays #IPG2MURJC

Ejemplo 6

Adaptado por Oriol Borrás Gené @oriolupm

Operación de salida de las componentes de un array:

TYPETDiasSemana = (Lun, Mar,Mie, Jue,Vie, Sab, Dom); TArrayDeDias = array [TDiasSemana] OF integer;

VARdia: TDiasSemana;visitasMuseo, ingresoMuseo: TArrayDeDias;

BEGIN...FOR dia := Lun TO Dom DOwriteln(visitasMuseo[dia]);

...END.

http://rextester.com/EPG88628

Page 38: Tema 5. Arrays #IPG2MURJC

Ejemplo 7

Adaptado por Oriol Borrás Gené @oriolupm

NO se pueden realizar operaciones de entrada/salida con arrays

completos:

TYPETDiasSemana = (Lun, Mar, Mie, Jue, Vie, Sab, Dom); TArrayDeDias = array [TDiasSemana] OF integer;

VARdia: TDiasSemana;visitasMuseo, ingresoMuseo: TArrayDeDias;

BEGIN...writeln(visitasMuseo); {ERROR}

...END.

Hay que hacerlo de manera secuencial, uno a uno.

Page 39: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Asignación a arrays completos:

● Se puede asignar un array a otro si los tipos son idénticos.

● Dependiendo de las versiones de Pascal, la asignación de un array

completo se puede realizar entre arrays de tipos equivalentes

aunque no sean idénticos.

Page 40: Tema 5. Arrays #IPG2MURJC

Ejemplo 8

Adaptado por Oriol Borrás Gené @oriolupm

Asignación a arrays completos:

CONSTINI = 1;LIMITE = 100;

TYPETRango = INI..LIMITE;TNota = array[TRango] OF real;

VARnotas_a, notas_aa: TNota;

BEGIN...notas_a := notas_aa;

...END.

Page 41: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Recomendaciones

● Evitar errores de intervalo:

cuando un subíndice toma valores fuera de su rango definido.

● Para activar la verificación de intervalos:

Options/Compiler Chequear Rango

Page 42: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Arrays como parámetros de subprogramas

● Se definen como parámetro empleando un tipo definido, nunca un

tipo anónimo.

● Respetar las reglas de compatibilidad de tipos entre parámetros

reales y formales:

● Parámetros formales por referencia, que sean arrays, deben ser exactamente del

mismo tipo que sus parámetros reales (tipos idénticos).

● Parámetros formales por valor, que sean arrays, deben ser del mismo tipo que

sus correspondientes parámetros reales, a menos que sean cadenas (más

adelante). En este caso basta con que sean de la misma longitud.

Page 43: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Arrays en Funciones.

● Las funciones NO pueden devolver valores de tipo array.

● Si un subprograma necesita devolver un array, éste se deberá

pasar como parámetro por referencia de un procedimiento.

Paso de arrays por valor o por referencia.

● El paso por valor puede conllevar el uso poco eficiente de la

memoria (copia del array en el parámetro formal).

● Generalmente se pasan por referencia aunque no se vaya a

cambiar el valor de sus componentes (cuidado con efectos

laterales).

Page 44: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Arrays parcialmente llenos

● En Pascal, la memoria correspondiente a un array se declara

estáticamente (un array tiene un número fijo de componentes).

● Si este número puede variar de una ejecución a otra, habrá que

hacer una estimación del número máximo de elementos que el

array puede contener y llevar un registro de la parte ocupada.

Page 45: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Arrays parcialmente llenos

● Se puede utilizar una variable que vaya marcando el extremo

superior de la parte ocupada.

○ Definir el array con el máximo y utilizar una variable indicadora

(“tope”) del número de componentes del array.

○ Cuando se pasa el array como parámetro también habrá que

pasar el “tope”.

Page 46: Tema 5. Arrays #IPG2MURJC

Ejemplo 9

Adaptado por Oriol Borrás Gené @oriolupm

Leer por teclado y mostrar por pantalla los salarios de los empleados

de una empresa (Máximo 30).

Análisis del problema:

Entrada: Salida:

Empleado Nº 1 y salario: 234.50 Empleado Salario

¿Más empleados (S/N) ? S 1 234.50

Empleado Nº 2 y salario: 345.50 2 345.50

¿Más empleados (S/N) ? n Salario Medio: 290 €

Page 47: Tema 5. Arrays #IPG2MURJC

Ejemplo 9

Adaptado por Oriol Borrás Gené @oriolupm

CONSTINI = 1;MAX = 30;

TYPETIndice = INI..MAX;TArraySueldos = array [TIndice] OF real;

PROCEDURE Registra(VAR sueldos: TArraySueldos; VAR tope: TIndice);

VARopcion: char;

BEGIN

write('Quieres Introducir Empleados (S/N): ':50);readln(opcion);

Page 48: Tema 5. Arrays #IPG2MURJC

Ejemplo 9

Adaptado por Oriol Borrás Gené @oriolupm

WHILE ((opcion = 'S') OR (opcion = 's')) AND (tope < MAX) DOBEGIN

tope := tope + 1;writeln('Empleado Nº: ',Tope,': ');write('Salario: ');readln(sueldos[tope]);write('Quieres Introducir Empleados (S/N): ':50);readln(opcion);

END {while}

END;{de Registra }

http://rextester.com/RQKJU86742

Page 49: Tema 5. Arrays #IPG2MURJC

5.2.3. Operaciones con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Arrays como constantes

CONST

colores: array [1..3] OF string = (‘rojo’,’verde’,’azul’);

No es un tipo índice!!

Page 50: Tema 5. Arrays #IPG2MURJC

5.4. Arrays multidimensionales

Adaptado por Oriol Borrás Gené @oriolupm

● En algunos problemas los datos que se procesan se pueden

organizar de forma natural como una tabla (2 dimensiones) o con

un array de más de 2 índices.

Ejemplo: las temperaturas máximas de varias ciudades a lo largo de los

días de un mes.

Page 51: Tema 5. Arrays #IPG2MURJC

5.4. Arrays multidimensionales

Adaptado por Oriol Borrás Gené @oriolupm

● El acceso a cada elemento de un array de N dimensiones se

realiza a través de N índices.

● Para acceder a todas las componentes de un array

multidimensional serán necesarios tantos bucles anidados como

dimensiones tenga el array (un bucle para cada dimensión).

● Los arrays bidimensionales nos permiten representar matrices y por

lo tanto operar con ellas. Una matriz de 2 dimensiones n x m se

podrá representar: array [1..n, 1..m] OF TipoBase

Page 52: Tema 5. Arrays #IPG2MURJC

Ejemplo 10

Adaptado por Oriol Borrás Gené @oriolupm

Acceso a un elemento de un array de 2 dimensiones:

TYPECiudades = (Soria, Madrid, Avila, ..., Zamora);tDias = 1..31;tTabla = array[tDias,ciudades] of real;

VARtabla: tTabla;ciu:Ciudades;dia:tDias;

BEGIN

tabla[1,Soria]:=15.3;

Page 53: Tema 5. Arrays #IPG2MURJC

Ejemplo 11

Adaptado por Oriol Borrás Gené @oriolupm

Recorrido por filas para leer las componentes

For dia:= 1 to 31 doFor ciu:= Soria to Zamora do

Readln(tabla[dia,ciu]);

Recorrido por columnas para leer las componentes

For ciu:= Soria to Zamora doFor dia:= 1 to 31 do

Readln(tabla[dia,ciu]);

Page 54: Tema 5. Arrays #IPG2MURJC

Ejemplo 11

Adaptado por Oriol Borrás Gené @oriolupm

Mostrar el contenido de una matriz de 2 dimensiones:

PROCEDURE EscribeMatriz(matriz:tArray2dimensiones; n:integer ;m:integer);

VARf,c:integer;

BEGIN

FOR f:= 1 TO n DO BEGINFOR c:= 1 TO m DO

WRITE (matriz[f,c]);WRITELN;

...

Page 55: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string

Adaptado por Oriol Borrás Gené @oriolupm

● String = Cadenas de Caracteres (TURBO PASCAL)

= array de Caracteres (PASCAL)

● PASCAL estándar no tiene tipo string.

● TURBO PASCAL incorpora el tipo string y las funciones y

procedimientos para manejarlo.

Page 56: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string

Adaptado por Oriol Borrás Gené @oriolupm

● String = Cadenas de Caracteres (TURBO PASCAL)

= array de Caracteres (PASCAL)

● PASCAL estándar no tiene tipo string.

● TURBO PASCAL incorpora el tipo string y las funciones y

procedimientos para manejarlo.

Page 57: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string

Adaptado por Oriol Borrás Gené @oriolupm

Declaración tipo string (sintaxis):

identificador: string[MAX];

Ejemplo:

CONST LIMITE = 10;

VARnombre: string[LIMITE]; departamento: string[20];mensaje: string;

{Como no se ha limitado explícitamente el tamaño, mensaje puede almacenar hasta 255 caracteres}

MAX es una constante entera que

especifica el número máximo de

caracteres que puede llegar a tener la

cadena (por defecto 255).

Page 58: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string

Adaptado por Oriol Borrás Gené @oriolupm

● Se puede acceder a los caracteres de una cadena mediante sus

índices, como en los arrays.

● La longitud de la cadena (n) es el número de caracteres que tiene.

● El string tiene además una posición 0 en la que se almacena el chr (n).

Longitud := ord(Cadena[0]);

NOTA: No debemos modificar esa posición del String.

Page 59: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string (ejemplo)

Adaptado por Oriol Borrás Gené @oriolupm

CONSTLIMITE = 8;

VARnombre: string[LIMITE];departamento: string[15];descripcion: string;

ord(departamento[0]) = 10

chr(10) = http://rextester.com/DWJMI66852

Page 60: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string

Adaptado por Oriol Borrás Gené @oriolupm

Asignación:

cadena := Expresión

Expresión puede ser una constante, una variable o una expresión

cualquiera del tipo cadena o de tipo char.

Page 61: Tema 5. Arrays #IPG2MURJC

5.5. Tipo string

Adaptado por Oriol Borrás Gené @oriolupm

Asignación (ejemplo):

Por pantalla se mostraría:VAR

cadena1: string;cadena2: string[3];

BEGIN

cadena1 := 'A';cadena1 := 'HOLA';cadena1 := cadena1[3];cadena2 := 'Maria';writeln(ord(cadena2[0]));

Page 62: Tema 5. Arrays #IPG2MURJC

5.5.1. Operaciones

Adaptado por Oriol Borrás Gené @oriolupm

Operaciones

● Se pueden Leer y Escribir:

readln(cadena1);

writeln(cadena1);

● Operaciones lógicas:<, >, =, <=, >= y <>

○ Se comparan carácter a carácter.

○ Si una es más corta que la otra, se compara como si la más corta

se rellenará con blancos.

Page 63: Tema 5. Arrays #IPG2MURJC

5.5.1. Operaciones

Adaptado por Oriol Borrás Gené @oriolupm

Operaciones

● Concatenación. Dos formas de hacerlo:

○ Operador +

string + string -> string

○ Función Concat

Concat(string, string)->string

cadena1:= 'lenguaje';

cadena2:= ' Pascal';

lenguaje:= cadena1 + cadena2

cadena1:= 'lenguaje';

cadena2:= ' Pascal';

lenguaje:= Concat(cadena1, cadena2);

>> lenguaje Pascal

Page 64: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Longitud

length(cadena)

length:(string) ->(devuelve) int

● Halla la longitud lógica o real (valor entero) de la cadena argumento.

● length (cadena) es equivalente a ord (cadena[0])

Page 65: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Posición de una cadena en otra

pos(cadena1, cadena2)

pos: (string, string)-> (devuelve) int

● Devuelve:

○ La posición (valor entero) en la que comienza la cadena1 dentro de

cadena2, o

○ El valor 0 cuando cadena1 no está incluida en cadena2.

Page 66: Tema 5. Arrays #IPG2MURJC

Ejemplo 12

Adaptado por Oriol Borrás Gené @oriolupm

Posición de una cadena en otra

VARcadena1, cadena2: string;

BEGIN...

cadena1 := 'Metodologia de programacion';cadena2 := 'Metodologia';writeln(pos(cadena1, cadena2));...

END.

Cambiando a : writeln(pos(cadena2, cadena1));

Devuelve por pantalla:

>> 0

Devuelve por pantalla:

>> 1

http://rextester.com/JOD15038

Page 67: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Extraer una subcadena

copy (cadena, posición, tamaño)

copy:(string, int, int)-> (devuelve) cadena

● Devuelve una subcadena de cadena, formada por tamaño caracteres a

partir de posición.

Page 68: Tema 5. Arrays #IPG2MURJC

Ejemplo 13

Adaptado por Oriol Borrás Gené @oriolupm

Extraer una subcadena

VARcadena1: string;

BEGIN...cadena1:= 'Metodologia de Programacion';writeln(copy(cadena1,3,4));...

END.

Devuelve por pantalla:

>> todo

Page 69: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Borrado

delete (cadena, posición, tamaño)

● Borra tamaño caracteres de cadena a partir de posición. La cadena

reduce su longitud en el número de caracteres eliminados.

Page 70: Tema 5. Arrays #IPG2MURJC

Ejemplo 14

Adaptado por Oriol Borrás Gené @oriolupm

Borrado

VARcadena1: string;

BEGIN...cadena1 := 'Metodologia de la Programacion';delete(cadena1,7,16);writeln(cadena1);...

END.

Devuelve por pantalla:

>> Metodoramacion

Page 71: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Inserción

insert(cadena1, cadena2, posición)

● Inserta cadena1 en cadena2 a partir de posición. La cadena2 aumenta

su longitud con el número de caracteres igual a la longitud de la

cadena1.

Page 72: Tema 5. Arrays #IPG2MURJC

Ejemplo 15

Adaptado por Oriol Borrás Gené @oriolupm

Inserción

VARcadena1, cadena2: string;

BEGIN

...cadena1 := 'Metodologia ';cadena2 := 'Programacion: ';insert(cadena1, cadena2, 1);writeln(cadena2);...

END.

Devuelve por pantalla:

>> Metodologia Programacion:

Page 73: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Conversión

str (expresion-numerica, cadena)

● Convierte el valor de expresión-numérica en cadena (su

representación como cadena de caracteres).

Page 74: Tema 5. Arrays #IPG2MURJC

Ejemplo 16

Adaptado por Oriol Borrás Gené @oriolupm

Conversión

VARi: integer;cadena: string;

BEGIN...i := 1200;str(i, cadena);writeln(cadena);...

END.

Devuelve por pantalla:

>> ‘1200’

VARr: real;cadena: string;

BEGIN...r := 5.5;str(r,cadena);writeln(cadena);...

END.

Devuelve por pantalla:

>> ‘5.5000000000E+0.0’

Page 75: Tema 5. Arrays #IPG2MURJC

5.5.2. Funciones predefinidas

Adaptado por Oriol Borrás Gené @oriolupm

Conversión

val(cadena, valorNumérico, código-error)

● Convierte cadena en su valor numérico real valorNumérico (también

puede ser un entero) y devuelve un código-error (integer) cuyo valor

podrá ser:

○ 0 si se puede hacer la conversión,

○ la posición del primer carácter que produjo el error en caso

contrario.

Page 76: Tema 5. Arrays #IPG2MURJC

Ejemplo 17

Adaptado por Oriol Borrás Gené @oriolupm

Conversión

CONSTCADENA = '345';

VARerror: integer;valor: real;

BEGIN...val(CADENA,valor,error);...

END.

valor-> valor->Error-> error->

VARcadena: string[10];error:integer;valor:real:

BEGIN

cadena:=‘hola’;val(cadena,valor,error);

END.

3.4500000000E+2

0 1

Page 77: Tema 5. Arrays #IPG2MURJC

5.6. Algoritmos con arrays

Adaptado por Oriol Borrás Gené @oriolupm

Dos de las operaciones más usuales con los arrays son:

● Búsqueda de un dato en un array.

● Ordenación de las componentes de un array.

Page 78: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda

Adaptado por Oriol Borrás Gené @oriolupm

● Determinan si un dato concreto se encuentra en una colección de

datos del mismo tipo.

● En caso de que se encuentre el dato, permiten conocer la posición que

ocupa.

● Los algoritmos de búsqueda más usuales son:

○ Búsqueda secuencial o lineal

○ Búsqueda binaria o dicotómica

Page 79: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda

Adaptado por Oriol Borrás Gené @oriolupm

● Precondiciones:

○ La búsqueda se hará en un array unidimensional (vector),

tratando de encontrar un elemento, elemBuscado.

○ El array vector es de n elementos.

○ El índice del array está formado por el intervalo [Primero..Ultimo].

Page 80: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda

Adaptado por Oriol Borrás Gené @oriolupm

● Objetivo:

Definir una función Búsqueda que encuentre el primer valor del índice

posición, de tal manera que se cumpla que:

vector [posicion] = elemBuscado

Page 81: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (sec. o lineal)

Adaptado por Oriol Borrás Gené @oriolupm

1. Búsqueda secuencial o lineal:

● Se realiza un recorrido del array comparando el elemento buscado con

los valores contenidos en las componentes del array.

● Se comienza con la primera componente y se va avanzando de forma

secuencial hasta que:

○ Se encuentra el valor buscado, o

○ Se llega al final del array (o de su parte ocupada) sin encontrarlo,

por ejemplo devuelve 0.

Page 82: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (sec. o lineal)

Adaptado por Oriol Borrás Gené @oriolupm

Page 83: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (sec. o lineal)

Adaptado por Oriol Borrás Gené @oriolupm

Page 84: Tema 5. Arrays #IPG2MURJC

Ejemplo 18

Adaptado por Oriol Borrás Gené @oriolupm

PROGRAM ejemplo18;

CONSTPRIMERO = 1 ;ULTIMO = 100 ;

TYPETIntervalo = PRIMERO..ULTIMO;TElem = integer;TVector = array [TIntervalo] OF TElem;

VARvector : TVector;elem : TElem;

Page 85: Tema 5. Arrays #IPG2MURJC

Ejemplo 18 (opción 1)

Adaptado por Oriol Borrás Gené @oriolupm

FUNCTION BusquedaSecuencial1(v:TVector;elemBuscado:TElem):integer;

VAR posicion : TIntervalo;

BEGINposicion := PRIMERO;

WHILE (posicion < ULTIMO) AND (v[posicion] <> elemBuscado) DO

posicion := succ(posicion);

IF (v[posicion] <> elemBuscado) THENBusquedaSecuencial1 := pred(PRIMERO)

ELSE BusquedaSecuencial1 := posicion ;

END; {BusquedaSecuencial1}

¿writeln(vector);? NUNCA!

http://rextester.com/VLVE91321

Page 86: Tema 5. Arrays #IPG2MURJC

Ejemplo 18 (opción 2)

Adaptado por Oriol Borrás Gené @oriolupm

FUNCTION BusquedaSecuencial2(v:TVector;elemBuscado:TElem):integer;

VAR posicion: integer;

BEGIN

posicion:= pred(PRIMERO);

REPEATposicion := succ(posicion);

UNTIL (posicion = ULTIMO) OR (v[posicion] = elemBuscado);IF v[posicion] = elemBuscado THEN

BusquedaSecuencial2 := posicionELSE

BusquedaSecuencial2 := pred(PRIMERO);

END; {BusquedaSecuencial2}

Page 87: Tema 5. Arrays #IPG2MURJC

Ejemplo 18 (opción 3)

Adaptado por Oriol Borrás Gené @oriolupm

FUNCTION BusquedaSecuencial3(v:TVector;elemBuscado:TElem):integer;

VARposicion: pred(PRIMERO)..ULTIMO;{integer}encontrado: boolean; {centinela}

BEGINposicion := pred(PRIMERO);encontrado := FALSE;BusquedaSecuencial3 := posicion;

REPEATposicion := succ(posicion);

IF v[posicion] = elemBuscado THEN BEGIN

encontrado := TRUE;BusquedaSecuencial3 := posicion

END UNTIL (posicion = ULTIMO) OR (encontrado);

END; {BusquedaSecuencial3}

Page 88: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (sec. o lineal 2)

Adaptado por Oriol Borrás Gené @oriolupm

2. Búsqueda secuencial o lineal en un array ordenado:

● Precondición: los elementos del array están ordenados de forma

creciente (decreciente).

● Se comienza con la primera componente y se va avanzando de forma

secuencial hasta que:

○ Se encuentra el valor buscado, o

○ Se llega a una componente con un valor mayor que el buscado

(orden ascendente), o

○ Se llega al final del array sin encontrarlo.

Page 89: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda

Adaptado por Oriol Borrás Gené @oriolupm

Page 90: Tema 5. Arrays #IPG2MURJC

Ejemplo 19

Adaptado por Oriol Borrás Gené @oriolupm

FUNCTION BusquedaSecOrdenada(v:TVector;elemBuscado:TElem):integer;

VARposicion: integer ;

BEGINposicion := pred(PRIMERO);REPEAT

posicion := succ(posicion); UNTIL (posicion = ULTIMO) OR (v[posicion] >= elemBuscado);IF v[posicion] = elemBuscado THEN

BusquedaSecOrdenada := posicionELSE

BusquedaSecOrdenada := pred(PRIMERO)

END; {BusquedaSecOrdenada}

http://rextester.com/VYCUU16063

Page 91: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

3. Búsqueda binaria o dicotómica

● Precondición: los valores de los elementos del array están ordenados

(Creciente/Decreciente).

● La búsqueda binaria divide el array en dos mitades y determina si

elemBuscado está en la primera o en la segunda mitad.

● Continúa dividiendo el espacio de búsqueda en mitades hasta

encontrar el elemento o determinar que no está.

● La búsqueda binaria es el método utilizado para buscar en un

diccionario, listín telefónico, etc.

Page 92: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Fases:

1. Comparar elemBuscado con el elemento central del array.

2. Si es igual, la búsqueda ha terminado.

3. Si no es igual, se busca en la mitad adecuada del array

(descartando la búsqueda en la otra mitad):

a. La primera mitad, si elemBuscado < vector[central]

b. La segunda mitad, si elemBuscado > vector[central]

4. Se vuelve al paso 1. la mitad elegida.

Este proceso se repite hasta que se encuentra elemBuscado o la mitad

elegida está vacía o tiene un solo elemento.

Page 93: Tema 5. Arrays #IPG2MURJC

Ejemplo 20

Adaptado por Oriol Borrás Gené @oriolupm

FUNCTION BusquedaBinaria(v:TVector;elemBuscado:TElem):integer;VAR

extInf, extSup, central: integer;encontrado: boolean;

BEGINextInf := PRIMERO;extSup := ULTIMO;encontrado := FALSE;

WHILE (NOT encontrado) AND (extSup >= extInf) DO BEGIN {WHILE}

central := (extSup + extInf) DIV 2; IF v[central] = elemBuscado THEN

encontrado:= TRUEELSE

IF v[central] < elemBuscado THENextInf := succ(central)

ELSEextSup := pred(central);

END; {WHILE}(…)

(…)

IF encontrado THEN BusquedaBinaria := central

ELSE BusquedaBinaria := pred(PRIMERO)

END; {BusquedaBinaria}

http://rextester.com/UEB9635

Page 94: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Usaremos

3 índices

Page 95: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Page 96: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Page 97: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Page 98: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Page 99: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Page 100: Tema 5. Arrays #IPG2MURJC

5.6.1. Algoritmos de búsqueda (binaria)

Adaptado por Oriol Borrás Gené @oriolupm

Page 101: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación

Adaptado por Oriol Borrás Gené @oriolupm

● Mecanismo que permite ordenar los elementos de un array.

● Existen numerosos algoritmos de ordenación, clasificándolos por la

forma en que ordenan:

○ Intercambio

○ Fusión

Page 102: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio

● Los algoritmos de intercambio se caracterizan por intercambiar pares

de elementos del array hasta conseguir su ordenación.

● Los más conocidos son:

○ Selección directa

○ Inserción directa

○ Intercambio directo (burbuja)

Page 103: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (selección directa)

● NO es el más aconsejable para ordenar ARRAYS GRANDES, pero se

comporta razonablemente bien en arrays pequeños.

● Se recorre el array seleccionando un elemento (menor/mayor) en cada

recorrido y se coloca en la posición correcta. Tras n-1 recorridos, el

array está ordenado.

Page 104: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (selección directa)

● Paso 1: se selecciona el elemento de valor menor (mayor),

intercambiando su posición con la del primer elemento del array.

● Paso 2: se busca el valor menor (mayor) en las posiciones restantes

del array (2,...,n), intercambiando su posición con la del segundo

elemento del vector.

Page 105: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (selección directa)

● Paso j-1: se sitúa en la posición j-1 del array el valor menor (mayor)

entre v[j-1] y v[n].

● Paso n-1: se sitúa en la posición n-1 del array el valor menor (mayor)

entre v[n-1] y v[n].

Page 106: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (selección directa)

● Necesitamos 3 índices: 2 para recorrer el array (i,j) y 1 que apunta al menor

elemento (posMenor).

● Necesitamos 1 variable auxiliar para el intercambio, valMenor

Page 107: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (selección directa)

67 33 21 84 49 50 75

21 33 67 84 49 50 75

21 33 67 84 49 50 75

21 33 49 84 67 50 75

21 33 49 50 67 84 75

21 33 49 50 67 84 75

21 33 49 50 67 75 84

Page 108: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (selección directa)

Pasos, para i desde 1 a n-1:

1. Asignar a posMenor el valor i

2. Asignar a valMenor el valor v[posMenor]

3. Para j desde i+1 a n:

Si v[j]<valMenor, entonces:

i. Asignar a posMenor el valor j

ii. Asignar a valMenor el valor v[posMenor]

4. Asignar a v[posMenor] el valor de v[i]

5. Asignar a v[i] el valor valMenor

INICIALIZACIÓN

BÚSQUEDA

INTERCAMBIO

Page 109: Tema 5. Arrays #IPG2MURJC

Ejemplo 21

Adaptado por Oriol Borrás Gené @oriolupm

PROCEDURE SeleccionDirecta (VAR v: TVector);VAR i, j, posMenor : integer ;

valMenor: integer;BEGIN

FOR i := PRIMERO TO pred(ULTIMO) DO BEGIN

valMenor := v[i];posMenor := i;FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN BEGIN

valMenor := v[j];posMenor := j

END; {IF}IF posMenor <> i THEN BEGIN

v[posMenor] := v[i] ;v[i] := valMenor;

END; {IF}END; {FOR i}

END; {SeleccionDirecta}

INICIALIZACIÓN

BÚSQUEDA

INTERCAMBIO

http://rextester.com/IHNW66914

Page 110: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=1

valMenor:=v[1]=5

posmenor:=1;

j:=2

(no entramos en el IF del FOR j)

1 2 3 4 5 6 7 8 9

Page 111: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=1

valMenor:=v[1]=5

posmenor:=1;

j:=3

(no entramos en el IF del FOR j)

1 2 3 4 5 6 7 8 9

Page 112: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=1

valMenor:=v[j]=3

posmenor:=j=4

j:=4

1 2 3 4 5 6 7 8 9

Page 113: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=1

valMenor:=v[j]=3

posmenor:=j=4

j:=5,6

(no entramos en el IF del FOR j)

1 2 3 4 5 6 7 8 9

Page 114: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=1

valMenor:=v[j]=0

posmenor:=j=7

j:=7

1 2 3 4 5 6 7 8 9

Page 115: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=1

valMenor:=v[j]=0

posmenor:=j=7

j:=8,9

(no entramos en el IF del FOR j)

1 2 3 4 5 6 7 8 9

Page 116: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

i:=1

posmenor:=j=7

valMenor:=v[j]=0

v[posmenor]:=v[i]= 5

v[i]:=valmenor

1 2 3 4 5 6 7 8 9

Page 117: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=2

valMenor:=v[i]=6

posmenor:=2;

j:=3

1 2 3 4 5 6 7 8 9

Page 118: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}i:=2

valMenor:=v[j]=1

posmenor:=j=9

j:=9

1 2 3 4 5 6 7 8 9

Page 119: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

Page 120: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

j, posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

Page 121: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

j, posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

posMenor = i

-> No se intercambian

Page 122: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

j, posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

posMenor = i

-> No se intercambian

Page 123: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

j, posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

Page 124: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

j, posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

Page 125: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

i

v

j, posmenor

v

FOR i := PRIMERO TO pred(ULTIMO) DO

BEGIN

valMenor := v[i];

posMenor := i;

FOR j := succ(i) TO ULTIMO DO

IF v[j] < valMenor THEN

BEGIN

valMenor := v[j];

posMenor := j

END; {IF}

IF posMenor <> i THEN

BEGIN

v[posMenor] := v[i] ;

v[i] := valMenor;

END; {IF}

END; {FOR i}

END; {SeleccionDirecta}

1 2 3 4 5 6 7 8 9

Page 126: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (inserción directa)

● Método eficiente de ordenación para conjuntos pequeños de datos.

● Consiste en recorrer el array v, insertando cada elemento v[i] en el lugar

correcto entre los elementos ya ordenados v[PRIMERO] ,...,v[i-1].

Page 127: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (inserción directa)

● Paso 1: Se considera v[1] como primer elemento.

● Paso 2: Se inserta v[2] en la posición correspondiente en relación a v[1] y v[2].

● Paso i: Se inserta v[i] en la posición correspondiente en relación a v[1],...,v[i].

● Paso n: Se inserta v[n] en la posición correspondiente en relación a v[1],...,v[n].

Resumen: Para cada i entre 2 y n, situar v[i] en su posición ordenada respecto de

v[1],...,v[i-1].

Page 128: Tema 5. Arrays #IPG2MURJC

Ejemplo 22

Adaptado por Oriol Borrás Gené @oriolupm

PROCEDURE InsercionDirecta (VAR v: TVector) ;VAR

i, j: integer;aux: TElem; {guardamos un valor del vector}

BEGINFOR i := succ(PRIMERO) TO ULTIMO DO BEGIN

aux := v[i] ;j := pred(i) ;WHILE (j >= PRIMERO) AND (v[j] > aux) DO BEGINv[j+1] := v[j] ; {movemos un espacio el número para insertar en ese espacio el

valor menor}j := pred(j)

END; {WHILE}

v[j+1] := auxEND; {FOR}

END; {InsercionDirecta}

http://rextester.com/FLFF33104

Page 129: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 130: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 131: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 132: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 133: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 134: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 135: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 136: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 137: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 138: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 139: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 140: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 141: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (intercambio directo o

método )

● También llamado método de la burbuja.

● Eficiente para conjuntos pequeños de datos.

● Resumen

○ Recorrer el array, buscando el menor elemento, desde la última posición

hasta la actual. Una vez encontrado, se sitúa en la posición actual.

○ Para ello, se intercambian valores adyacentes siempre que estén

colocados en orden decreciente.

Page 142: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por intercambio (intercambio directo o

método )

● Paso 1. Situar el elemento mayor en la última posición del array.

● Paso 2. Situar el segundo elemento mayor en la penúltima posición del array.

● Paso i. Se repite el proceso para las posiciones intermedias.

● Paso n-1. Se comparan los valores de las dos primeras posiciones, situando el

n-1 mayor en la segunda posición.

Page 143: Tema 5. Arrays #IPG2MURJC

Ejemplo 23

Adaptado por Oriol Borrás Gené @oriolupm

PROCEDURE IntercambioDirecto(VAR v: TVector);

VARi, j: TIntervalo ;aux: TElem;

BEGINFOR i := PRIMERO TO pred(ULTIMO) DO

FOR j := PRIMERO TO ULTIMO-i DOIF v[j] > v[j+1] THENBEGIN

aux := v[j] ;v[j] := v[j+1] ;v[j+1] := aux

END; {IF}

END; {IntercambioDirecto}

http://rextester.com/TUODZ5733

Page 144: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 145: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 146: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 147: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 148: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 149: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 150: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 151: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 152: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 153: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 154: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 155: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 156: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 157: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 158: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 159: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 160: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 161: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 162: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 163: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 164: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 165: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 166: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 167: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 168: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 169: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 170: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 171: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 172: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 173: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 174: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 175: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 176: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (intercambio)

Adaptado por Oriol Borrás Gené @oriolupm

Page 177: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

Algoritmos de ordenación por fusión(intercambio directo o método )

● Se basan en la operación de fusión de 2 arrays ordenados.

● Dados 2 arrays ordenados A[INI..FA] y B[INI..FB], la fusión da como resultado

un array C [INI..FA+FB] con todos los elementos de A y B y que también estará

ordenado.

● Método: Mergesort o por mezcla.

Page 178: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

● En primer lugar vamos a ver cómo se fusionan 2 arrays ordenados.

● Realmente es uno dividido en sus dos mitades:

v [iz..ce] y v [ce+1..de]

● El resultado queda en el array w

Page 179: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

PROCEDURE Fusion(v:TVector; iz,de,ce: integer, VAR w: TVector);

VAR i, j, k: integer;

BEGIN {Fusion}i := iz; j := succ(ce); k := iz;WHILE (i <= ce) AND (j <= de) DO BEGIN

IF v[i] < v[j] THEN BEGIN

w[k] := v[i];i := succ(i)

ENDELSE BEGIN

w[k] := v[j];j := succ(j)

END;

k := succ(k);END;{while}FOR k := j TO de DO

w[k] := v[k];FOR k := i TO ce DO

w[k+de-ce] := v[k];END;{Fusion}

Page 180: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

Método de Mergersort:

● El tamaño umbral del problema corresponde a subarrays de tamaño 1 (un

array de un elemento se considera ordenado).

● También se puede considerar un tamaño umbral distinto de 1, y aplicar un

algoritmo de ordenación que se comporte bien para arrays de pequeño

tamaño.

Page 181: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

Fases método de Mergersort:

● Se divide el array a ordenar en dos partes iguales.

● Cada parte se ordena mediante llamadas recursivas hasta que se llega a un

determinado tamaño umbral del problema.

● Se fusionan las soluciones generando el array inicial ordenado.

Page 182: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

PROCEDURE Mergesort(VAR v: TVector; izq, der:TIntervalo);

VARcentro: TIntervalo;

BEGIN {Mergesort}centro := (izq + der) DIV 2;IF izq < centro THEN

Mergesort(v, izq, centro);IF centro + 1 < der THEN

mergesort(v, centro+1, der);Fusion(v, izq, der, centro, v)

END;{mergesort}

http://rextester.com/GHRH16649

Page 183: Tema 5. Arrays #IPG2MURJC

5.6.2. Algoritmos de ordenación (fusión)

Adaptado por Oriol Borrás Gené @oriolupm

Page 184: Tema 5. Arrays #IPG2MURJC

5.7. Uses

Adaptado por Oriol Borrás Gené @oriolupm

Unidades:

● Las unidades son librerías formadas por procedimientos y funciones que se

pueden llamar desde cualquier programa en pascal. Por defecto siempre se

carga la librería o unidad System.

● Para utilizar una unidad será imprescindible definirla en la zona de

declaraciones del programa mediante la palabra reservada uses

● Listado de unidades predefinidas disponibles en Pascal:

http://docs.mis-algoritmos.com/pascal.ref.math.html

● También podremos crearnos nuestras propias unidades.

Page 185: Tema 5. Arrays #IPG2MURJC

5.7. Uses

Adaptado por Oriol Borrás Gené @oriolupm

Unidades (sintaxis):

Program nombreprograma;

USES unidad;

CONST

VAR…

Page 186: Tema 5. Arrays #IPG2MURJC

Derechos imágenes

Adaptado por Oriol Borrás Gené @oriolupm

Todas las imágenes han sido extraídas de Pixabay:

https://pixabay.com/es/