Está en la página 1de 25

Algorítmica para Programación Pág.

60

VII. ARREGLO UNIDIMENSIONAL

7.1 ARREGLOS
Un arreglo es una colección de variables del mismo tipo que se referencian por
un nombre común. Para acceder a un elemento específico se utiliza un índice
que indica la posición del elemento.

Un arreglo es una estructura homogenia compuesta por varios componenetes,


todas del mimo tipo y almacenados consecutivamente en memoria. Cada
componente puede ser accedido directamente por el nombre de la variable
array seguido de un subìndice encerrado entre corchetes.

7.1.1 Declaración de un arreglo


Se debe especificar el tipo, el nombre y el tamaño del mismo entre paréntesis
cuadrados ([ ]).

Sintaxis:
Nombre_del_tipo Nombre_del_arreglo[tamaño_declarado];
Valor de una
Nombre del tipo int A[n + 5] = 8
variable indizada

Nombre del arreglo ó Índice o


variable del arreglo
subindice
El tamaño del arreglo debe especificarse de forma explicita, es decir, su valor
debe definirse en tiempo de codificación y no en tiempo de ejecución.

Existen dos tipos de arrays: unidimensionales y multidimensionales.

7.1.2 Arreglos Unidimensionales


Un arreglo unidimensional es un tipo de datos estructurado que está formado
de una colección finita y ordenada de datos del mismo tipo. Es la estructura
natural para modelar listas de elementos iguales.

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir,


podemos acceder a cualquier elemento del arreglo sin tener que consultar a
elementos anteriores o posteriores, esto mediante el uso de un índice para cada
elemento del arreglo que nos da su posición relativa.

Para implementar arreglos unidimensionales se debe reservar espacio en


memoria, y se debe proporcionar la dirección base del arreglo, la cota superior y
la inferior.

E1 E2 E3 E4 E5 E6 E7 E8
Pos 0 Pos 1 Pos 2 Pos 3 Pos 4 Pos 5 Pos 6 Pos 7

Arreglo[0] = E1 Arreglo[1] = E2 Arreglo[2] = E3 Arreglo[3] = E4


Arreglo[4] = E5 Arreglo[5] = E6 Arreglo[6] = E7 Arreglo[7] = E8

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 61

El índice de un arreglo siempre debe ser un valor entero.


El sexto elemento de un arreglo equivale al elemento ubicado en la posición n-1
El elemento 6 del arreglo tiene indice 6 y es el séptimo elemento del arreglo.

7.1.3 Inicialización de arreglos


Si se desea inicializar un arreglo en tiempo de codificación se debe hacer de las
formas siguientes:

int arreglo[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arreglo[5] = { 0 };/* todos los elementos del arreglo se inicializan con 0 */
int arreglo[10] = { 5 }; /* arreglo = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0 } */
int arreglo[6] = { 5, 4, 3 }; /* arreglo = { 5, 4, 3, 0, 0, 0 } */
int num[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
char cadena[5]=“hola”;

A continuación se muestra dos maneras de definir arreglos:

#include <iostream.h>
#include <stdlib.h>

int main()
{
const int TAM = 10;
int tamanio;
int arreglo[TAM];

do {
cout << "Digite tamaño del arreglo (entre 1 y 10): ";
cin >> tamanio;
} while (tamanio < 1 || tamanio > 10);

system("PAUSE");
return 0;
}

#include <iostream.h>
#include <stdlib.h>
#define TAM 10

int main()
{
int tamanio;
int arreglo[TAM];

do {
cout << "Digite tamaño del arreglo (entre 1 y 10): ";
cin >> tamanio;
} while (tamanio < 1 || tamanio > 10);

system("PAUSE");
return 0;
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 62

Ejemplos sobre arreglos

1. Desarrollar un algoritmo para leer datos en una Array y luego


imprimir

inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n incremento 1 en 1
leer A(i)
fin hacer
imprimiendo el array
hacer para i=0 mientras i<=n incrementado 1 en 1
imprime A(i)
fin hacer
fin

2. Desarrollar un algoritmo para sumar n


elementos del Array
inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n
incremento 1 en 1
leer A(i)
fin hacer
sumando los elementos del array
hacer para i=0 mientras i<=n incrementado 1
en 1
s=s+A(i)
fin hacer
imprimir s
fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 63

3. Desarrollar un algoritmo para multiplicar dos vectores numéricos en un


tercer vector

inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n incremento 1 en 1
leer A(i)
fin hacer
multiplicando los elementos del array
hacer para i=0 mientras i<=n incrementado 1 en 1
C(i)=A(i)*B(i)
fin hacer
imprimir C(i)
fin

4. Desarrollar un algoritmo para


ingresar n notas en un array y
luego calcular el numero de
aprobados y desaprobados

inicio
leer n
ingresando elementos para el array
hacer para i=0 mientras i<=n
incremento 1 en 1
leer A(i)
fin hacer
multiplicando los elementos del array
hacer para i=0 mientras i<=n
incrementado 1 en 1
C(i)=A(i)*B(i)
fin hacer
imprimir C(i)
fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 64

5. Inicializar e imprimir un arreglo a un valor dado por el usuario usando


for y while

/* Solución del problema usando for */

#include <iostream.h>
#include <stdlib.h>
#define TAM 10

int main()
{
int arreglo[TAM]; /*Arreglo de enteros */
int valor; /*Valor de inicialización del arreglo */
int indice; /*Variable de control ciclo for */

cout << "Digite el valor con el que desea inicializar los elementos del arreglo: ";
cin >> valor;
//INICIALIZAR EL ARREGLO
for (indice = 0; indice < TAM; indice++)
{
arreglo[indice] = valor;
}
//IMPRIMIR EL ARREGLO
for (indice = 0; indice < TAM; indice++)
{
cout << arreglo[indice] << " ";
}
system("PAUSE");
return 0;
}

6. Se define una constante TAM que es igual a 10, se declara un vector de


nombre arreglo y es de 10 elementos (TAM). Se declaran dos valores
enteros, valor que guarda el valor dado por el usuario para inicializar el
arreglo, indice cuyo fin es controlar el ciclo for. Se pide al usuario que digite
un valor para inicializar el arreglo, a continuación se inicializa el arreglo
usando un ciclo for. Por último se imprime el arreglo usando también la
estructura for y la misma variable de control.

A continuación se muestra el mismo arreglo pero usando while. Se debe tener


en cuenta que todo ciclo for se puede especificar con una estructura while.

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 65

/* Solución del problema usando while */


#include <iostream.h>
#include <stdlib.h>
#define TAM 10
int main()
{ int arreglo[TAM]; /*Arreglo de enteros */
int valor; /*Valor de inicialización del arreglo */
int indice; /*Variable de control ciclo for */
cout << "Digite el valor con el que desea inicializar los elementos del arreglo: ";
cin >> valor;
//inicializar el arreglo
indice = 0;
while (indice < TAM)
{ arreglo[indice] = valor;
indice++;
}
//IMPRIMIR EL ARREGLO
indice = 0;
while (indice < TAM)
{ cout << arreglo[indice] << " ";
indice++;
}
system("PAUSE");
return 0;
}

7. Una empresa desea procesar las ventas realizadas mes a mes anualmente con
el fin de obtener la siguiente información:
 Mes en el que se obtuvo la mejor venta
 El monto de la venta máxima obtenida
 Total de las ventas
 Promedio de ventas
 Mostrar las ventas de menor a mayor

#include <stdlib.h>
#include <iostream.h>
void main(void)
{ float ventas[12]; //Arreglo que guarda las ventas del mes
int mes, i; //Guarda mes(indice) de una venta en el arreglo
int mesVMax; //Guarda el mes de la venta máxima
float ventaMax; //Guarda el monto de la venta máxima
float totalVentas; //Guarda el monto total de ventas en el año
float temporal; //Se utiliza en el ordenamiento de las ventas
system("CLS"); //Limpiar pantalla
cout << "programa de procesamiento de ventas anuales: \n\n";
for(mes = 0; mes < 12 ; mes++)
{ cout << "Digite las ventas del mes número " << mes +1 <<": ";
cin >> ventas[mes];
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 66

system("CLS"); //Limpiar pantalla


cout << "Programa de procesamiento de ventas anuales: \nventas\n";
//Escribir ventas
for(mes = 0; mes < 12 ; mes++)
cout << "Mes " << mes +1 <<": " << ventas[mes] << "\n" ;
cout << "\n";
/*Determinar venta maxima, mes venta maxima, total ventas*/
totalVentas = ventas[0];
ventaMax = ventas[0];
mesVMax = 0;
for(mes = 1; mes < 12 ; mes++)
{
if(ventas[mes] > ventaMax)
{
ventaMax = ventas[mes];
mesVMax = mes;
}
totalVentas += ventas[mes];
}
//Ventas en orden ascendente
for (i = 0; i < 12; i++)
for(mes = 0; mes < 11 - i ; mes++)
{
if(ventas[mes] > ventas[mes+1])
{
temporal = ventas[mes];
ventas[mes] = ventas[mes+1];
ventas[mes+1] = temporal;
}
}
/*Muestra de resultados*/
cout << "La venta máxima se dio en el mes: " << mesVMax + 1 << endl
<< "La venta máxima en el año fue: " << ventaMax << endl
<< "Total de ventas en el año: " << totalVentas << endl
<< "Promedio de ventas en el año: " << totalVentas/12 << endl
<< "\nVentas en orden ascendente: " << endl;
//Ventas en orden ascendente
for(mes = 0; mes < 12 ; mes++)
cout << ventas[mes] << " ";
cout << "\n\n";
system("PAUSE"); //Ver resultados en pantalla antes de pulsar una tecla

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 67

8. Desarrollar un programa que permita ingresar n notas. El programa debe


calcular: el numero de aprobados y el numero de desaprobados, el % de
aprobados y el % de desaprobados.

#include"iostream.h"
main()
{ int n,i,Aprobado=0,desaprobado=0;
float A[100],porcentaje;
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{ cout<<"Nota"<<i<<":";
cin>>A[i];
}
for(i=1;i<=n;i++)
{ if(A[i]>=10.5)
Aprobado=Aprobado+1;
else
desaprobado=desaprobado+1;
}
cout<<"el numero de aprobados es:"<<Aprobado<<endl;
cout<<"el numero de desaprobados es:"<<desaprobado<<endl;
cout<<"el porcenaje de aprobados es:"<<Aprobado*100/n<<"%"<<endl;
cout<<"el porcentaje de desaprobados
es:"<<desaprobado*100/n<<"%"<<endl;
return 0;
}

7.2 Búsqueda lineal en un arreglo

A continuación se implementa un algoritmo de búsqueda lineal que permite


determinar si un elemento está o no dentro de un arreglo. Este tipo de
búsqueda consiste en comparar el elemento buscado con cada uno de los
elementos del arreglo. Si el arreglo no está ordenado, existe la misma
probabilidad de que el elemento se encuentre, ya sea en el primer elemento
como en el último.

#include <iostream.h>
#include <stdlib.h>

int main()
{
const int tamanoArreglo = 100; // tamaño del arreglo a
int a[ tamanoArreglo ]; // crea el arreglo a
int claveBusqueda; // valor a localizar dentro de a
int pos; // Posición de la clave buscada

for ( int i = 0; i < tamanoArreglo; i++ ) // crea algunos datos


a[ i ] = 2 * i;

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 68

cout << "Introduce la clave de búsqueda entera: ";


cin >> claveBusqueda;

pos = -1; // Si no se encuentra entonces en pos se guarda -1


// intenta localizar claveBusqueda dentro del arreglo a
for ( int j = 0; j < tamanoArreglo; j++ )
if ( a[ j ] == claveBusqueda ) // si se encuentra ,
pos = j; // guarda la ubicación de la clave

// despliega los resultados


if ( pos != -1 )
cout << "Encontré valor en el elemento " << pos << endl;
else
cout << "Valor no encontrado" << endl;

system ("PAUSE");
return 0; // indica terminación exitosa

} // fin de main

9. Multiplicación de dos vectores

#include "iostream.h"
int main()
{ int A[100],B[100],C[100], n,i;
cout<<"cuantos datos desea ingresar ";
cin>>n;
cout<<"ingresando datos para el vector A \n";
for(i=0;i<n;i++)
{cout<<"dato"<<i<<":";
cin>>A[i];
}
cout<<"ingresando datos para el vector B \n";

for(i=0;i<n;i++)
{cout<<"dato"<<i<<":";
cin>>B[i];
}
for(i=0;i<n;i++)
{C[i]=A[i]*B[i];
cout<<C[i]<<endl;
}
return 0;
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 69

10. Desarrollar un programa que permita ingresar n números en un arreglo y


luego imprimir los elementos del arreglo tal como se ingreso en forma inversa.

#include"iostream.h"
main()
{ int n,i,v=0,x=0,A[100];
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{ cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=1;i<=n;i++)
{ cout<<A[i]<<endl;
}
cout<<"vector inversa"<<endl;
for(i=n;i>0;i--)
{ cout<<A[i]<<endl;
}
return 0;
}

11. Desarrollar un programa que evalué el mayor valor de los elementos


ingresados en el vector
#include"iostream.h"
main()
{ int n,i,mayor,indice,j,A[100];
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{ cout<<"A["<<i<<"]:";
cin>>A[i];
}
mayor=A[1];
for(j=1;j<=n;j++)
{ if(A[j]>mayor)
{ mayor=A[j];
indice=j;
}
}
cout<<"el mayor es:"<<mayor<<"y esta en la posicion"<<indice<<endl;
return 0;
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 70

7.3 Búsqueda binaria o dicotómica

Para utilizar este algoritmo, el array debe estar ordenado. La búsqueda binaria
consiste en dividir el array por su elemento medio en dos subarrays más
pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se
termina. Si el elemento es menor, debe estar (si está) en el primer subarray, y si
es mayor está en el segundo.

Ejemplo:
#include"iostream.h"
main()
{ int n,A[100],i,j,central,nbuscar,encontrado=0,primero=0,ultimo,temp;
cout<<"ingrese cantidad de elementos:"; cin>>n;
for(i=1;i<=n;i++)
{ cout<<"A["<<i<<"]: ";
cin>>A[i];
}
cout<<"elementos ordenados"<<endl;
for(i=1;i<n;i++)
{ for(j=i+1;j<=n;j++)
if(A[i]>A[j])
{ temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
for(i=1;i<=n;i++)
{ cout<<"A["<<i<<"]: "<<A[i]<<endl;
}
cout<<"ingrese el numero a buscar: ";
cin>>nbuscar;
ultimo=n;
while((primero<=ultimo) && (!encontrado))
{ central=(primero + ultimo)/2;
if(nbuscar==A[central])
encontrado=1;
else
if(nbuscar>A[central])
primero=central+1;
else
ultimo=central-1;
}
if(encontrado)
cout<<"el numero "<<nbuscar<<" se encuentra en la posicion
"<<central<<endl;
else
cout<<"el numero no se encuentra en el arreglo "<<endl;
return 0;
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 71

7.4 Ordenamiento
Es la operación de arreglar los registros de una tabla en algún orden secuencial de
acuerdo a un criterio de ordenamiento. El ordenamiento se efectúa con base en el
valor de algún campo en un registro. El propósito principal de un ordenamiento es el
de facilitar las búsquedas de los miembros del conjunto ordenado.
El ordenar un grupo de datos significa mover los datos o sus referencias para que
queden en una secuencia tal que represente un orden, el cual puede ser numérico,
alfabético o incluso alfanumérico, ascendente o descendente.

7.4.1 Métodos de Ordenamiento


o Bubble Sort
o Selection sort
o Insertion Sort
o Shell Sort
o Quick Sort
o Heap Sort
Para todos los algoritmos se cuenta con la siguiente estructura de datos
Const MAX = 100
A = arreglo[1..MAX] de enteros
Variable N:entero

a) Bubble Sort (Método de Burbuja)


Ordena los elementos del arreglo usando el método de burbuja. Transporta en
cada pasada el elemento más pequeño a la parte izquierda del arreglo A de N
elementos.
Algoritmo:
Burbuja1(A,N)
Inicio
Declarar i,j,aux:entero
Para i 2 hasta N haga
Para j  i hasta 2 inc (–1) haga
Si (A[j-1]>A[j]) entonces
Aux  A[j-1]
A[j-1]  A[j]
A[j]  aux
Fin si
Fin para
Fin para
Fin

Codigo en C++
#include"iostream.h"
main( )
{ int n,i,j,temp,A[100];
cout<<"ingrese cantidad de notas";
cin>>n;
for(i=1;i<=n;i++)
{ cout<<"Nota"<<i<<":";
cin>>A[i];
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 72

for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{ if(A[i]>A[j])
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
for(i=1;i<=n;i++)
cout<<A[i]<<endl;
return 0;
}

b) Shaker Sort (Ordenamiento por el Método de la Sacudida)


Este método es una optimización del método de la burbuja. Consiste en mezclar
las dos formas como se puede realizar el método de ordenamiento directo. En
cada pasada hay dos etapas, el la primera etapa se trasladan los elementos más
pequeños hacia la izquierda almacenando en una variable el último elemento
intercambiado. En la segunda etapa, se trasladan los elementos más grandes
hacia la parte derecha del arreglo almacenando en otra variable la posición del
último elemento intercambiado.

Algoritmo:
Shakersort(A,N)
Inicio
Declarar i, izq, der, k, aux: entero
izq  2
der N
kN
Repetir
Para i  der hasta izq inc (-1) haga
Si (A[i-1]>A[i]) entonces
Aux  A[i-1]
A[i-1]  A[i]
A[i]  aux
ki
Fin si
Fin para
Izq  k + 1
Para i  izq hasta der haga
Si (A[i-1] > A[i]) entonces
Aux  A[i-1]
A[i-1]  A[i]
A[i]  Aux
ki
Fin si
Fin para
Der  k-1
Hasta que izq>der
Fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 73

Codigo en C++
#include<iostream.h>
#include<conio.h>
main( )
{ int izq,der, aux,i,N,k;
float A[20];
cout<<"ingrese dimencion de matriz"; cin>>N;
k=N;izq=2;der=N;
for(i=1;i<=N;i++)
{ cout<<i<<" : "; cin>>A[i];
}
while(izq<der)
{
for(i =der;i>=izq;i--)
if (A[i-1]>A[i])
{ aux=A[i-1];
A[i-1]=A[i];
A[i]=aux;
k=i;
}
izq=k+1;
for(i =izq ;i<=der;i++)
if (A[i-1]>A[i])
{ aux=A[i-1];
A[i-1]=A[i];
A[i]=aux;
k=i;
}
der=k-1;
}
for(i=1;i<=N;i++)
cout<<A[i]<<" ";
return 0;
}

c) Insertion Sort (Metodo de Ordenamiento por Inserción)


El objetivo de este método es copiar la forma como los jugadores de cartas ordenan la
baraja en una mano. El objetivo de este método es insertar un elemento en la parte
izquierda del arreglo que ya se encuentra ordenada. El proceso se repite desde el
segundo hasta el n-esimo elemento.
Algoritmo:
insercion(A,N)
Inicio
Declarar i, aux, k: entero
Para i  2 hasta N haga
Aux  A[i]
k  i-1
Mientras Que ((k>=1) y (aux<A[k])) haga
A[k+1]  A[k]
k  k -1
Fin MQ
A[k+1]  aux
Fin para
Fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 74

Codigo en C++
#include "iostream.h"
main()
{ int A[100],N,i,k,aux;
cout<<"ingrese la dimensión del vector"; cin>>N;
for(i=1;i<=N;i++)
{ cout<<"A["<<i<<"]:";
cin>>A[i];
}
for(i=2; i<=N;i++)
{ aux=A[i];
k=i-1;
while((k>=1)&&(aux<A[k]))
{ A[k+1]=A[k];
k=k-1;
}
A[k+1]=aux;
}
for(k=1;k<=N;k++)
cout<<A[k]<<endl;
return 0;
}

d) Selección Sort (Ordenamiento por Selección)


La idea de este algoritmo es buscar el menor elemento del arreglo y colocarlo en
la primera posición, luego se busca el segundo elemento más pequeño del
arreglo y se coloca en la segunda posición y así. El algoritmo se basa en:
1. Seleccionar el menor elemento del arreglo.
2. Intercambiar dicho elemento con el primero.
3. Repetir los pasos anteriores con los (n-1), (n-2)... elementos y así
sucesivamente hasta que solo quede el elemento mayor.
Algoritmo que ordena los elementos de un arreglo usando el método de
selección directa. A arreglo de N elementos.

Algoritmo:
seleccion(A,N)
Inicio
Declarar i, menor, k, j: entero
Para i  1 hasta N-1 haga
Menor  A[i]
ki
Para j  i+1 hasta N haga
Si (A[j]<menor) entonces
Menor  A[j]
kj
Fin si
Fin para
A[k]  A[i]
A[i]  menor
Fin para
Fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 75

Codigo en C++
#include "iostream.h"
main()
{ int A[100],N,i,j,menor,k;
cout<<"ingrese la dimensión del vector"; cin>>N;
for(i=1;i<=N;i++)
{ cout<<"A["<<i<<"]:"; cin>>A[i];
}
for(i=1; i<=N-1;i++)
{ menor=A[i];
k=i;
for(j=i+1; j<=N;j++)
{ if(A[j]<menor)
{ menor=A[j];
k=j;
}
}
A[k]=A[i];
A[i]=menor;
}
for(k=1;k<=N;k++)
cout<<A[k]<<endl;
return 0;
}

e) Shell Sort (Ordenamiento con el Método de Shell)


Este algoritmo compara cada elemento del arreglo para su ubicación correcta, con los
elementos que se encuentran en la parte izquierda del mismo. Este método propone
que las comparaciones entre los elementos se efectúen con saltos de mayor tamaño,
pero con incrementos decrecientes.
Algoritmo:
shell(A,N)
Inicio
Declarar int, i, aux: entero
Declarar band: booleano
Int  N+i
Mientras Que (int>1) haga
int  parteentera(int/2)
band  VERDADERO
Mientras Que (band=VERDADERO) haga
Band  FALSO
i1
Mientras Que ((I+int)<=N) haga
Si (A[i]>A[i+int]) entonces
aux  A[i]
A[i]  A[i+int]
A[i+int]  aux
Band  VERDADERO
Fin si
i  i+1
Fin MQ
Fin MQ
Fin MQ
Fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 76

f) Quick Sort (Método Rápido de Ordenación por Partición)

Este algoritmo es el más eficiente y veloz de los métodos de ordenación interna.


La idea central del algoritmo es:
1. Se toma un elemento X de una posición cualquiera del arreglo
2. Se trata de ubicar a X en la posición de correcta del arreglo, de tal forma
que todos los elementos que se encuentran a su izquierda sean menores
o iguales a X y todos los elementos que se encuentran a su derecha sean
mayores o iguales a X.
3. Se repiten los pasos anteriores, pero con los conjuntos de datos que se
encuentran a la izquierda y a la derecha de la posición correcta de X en el
arreglo.
4. El proceso termina cuando todos los elementos se encuentran en su
posición correcta en el arreglo.

El paso 3 se puede hacer de forma iterativa o recursiva. En este ejemplo, se hará


de forma iterativa, dejando el método recursivo para más adelante en el curso.
Se necesitan dos algoritmos. Quicksortitera y reduceitera.
Algoritmo que ordena los elementos de un arreglo A de N elementos, usando el
método Quicksort iterativo.

Algoritmo:
Quicksortitera(A, N)
Inicio
Declarar top, ini, fin, pos: entero
Pilamayor: Arreglo[1..MAX] de entero
Pilamenor: Arreglo[1..MAX] de entero

Top  1
Pilamenor[top]  1
Pilamayor[top]  N
Mientras Que (top>0) haga
Ini  pilamenor[top]
Fin  pilamayor[top]
Top  top-1
Pos  Reduceitera(ini, fin)
Si (ini<(pos-1)) entonces
Top  top+1
Pilamenor[top]  ini
Pilamayor[top]  pos-1
Fin si
Si (fin>(pos+1)) entonces
Top  top+1
Pilamenor[top]  pos+1
Pilamayor[top]  fin
Fin si
Fin MQ
Fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 77

VIII. ARREGLO BIDIMENSIONAL – MATRICES

8.1 Definicion
Es un conjunto de datos homogéneo, finito y ordenado, donde se hace referencia a cada
elemento por medio de dos índices. El primero se utiliza para los renglones (filas) y el
segundo para las columnas. También puede definirse como un arreglo de arreglos.
Internamente en memoria se reservan MxN posiciones consecutivas para almacenar
todos los elementos del arreglo.

Una matriz es un arreglo bidimensional, es decir, que se maneja con dos índices. En
C++ se representan sus posiciones así:

Matriz M de 3x3
M[0][0] M[0][1] M[0][2]
M[1][0] M[1][2] M[1][2]
M[2][0] M[2][1] M[2][2]
El primer índice indica las filas y el segundo las columnas.

8.1.1 Inicializar matrices

int arreglo1[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };


int arreglo2[3][3] = { 0 }; /* todos los elementos del arreglo se inicializan con 0 */
int arreglo3[2][3] = { {2,4},{6,8} }; /* { {2, 4, 0}, {6, 8, 0} } */

Ejemplo:
Rellenar una matríz identidad de 4 por 4 elementos.
Una matriz identidad es aquella en la que la diagonal principal está llena de
unos y el resto de los elementos son cero. Para llenar la matriz identidad se debe
verificar que cuando los índices i y j sean iguales, la posición vale 1, en caso
contrario se asigna cero al elemento i,j.

Algoritmo
Inicio
Desde i = 1 hasta 4 hacer
Desde j = 1 hasta 4 hacer
Si i=j entonces
Matriz[i,j] =1
Sino
Matriz[i,j] =0
Fin_si
Fin_desde
Fin_desde
Fin

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 78

Ejemplos:
1. Inicializar e imprimir una matriz

#include <iostream.h>
#include <stdlib.h>
#define FILAS 2
#define COL 3
int main()
{
int matriz[FILAS][COL];
/*capturar datos de la matriz */
for (int fila = 0; fila < FILAS; fila++)
{ for (int col = 0; col < COL; col++)
{
cout << "Digite el elemento de la posición [" << fila << "][" << col << "]: ";
cin >> matriz[fila][col];
}
}
cout << "\n\n***** MATRIZ GENERADA *****\n\n" ;
for (int fila = 0; fila < FILAS; fila++)
{ for (int col = 0; col < COL; col++)
{ cout << matriz[fila][col] << "\t";
}
cout << "\n";
}
system("PAUSE");
return 0;
}

2. Suma de los elementos de una matriz

#include "iostream.h"
int main()
{ int matriz[15][15], i, j, n, su=0, m;
cout<<"ingrese número de filas:";
cin>>m;
cout<<"ingrese número de columnas:";
cin>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ cout<<"matriz"<<i<<j;
cin>>matriz[i][j];
su=su+matriz[i][j];

}
cout<<"matriz dato"<<endl;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<matriz[i][j]<<endl;
}
cout<<"la suma total es:"<<su<<endl;
return 0;
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 79

3. Desarrollar un programa para leer los elementos de una matriz cuadrada, y


luego asignar los elementos de la diagonal principal a un vector M.

#include "iostream.h"
main()
{
int n,m,i,j,A[100][100],M[100];

cout<<"ingresando el orden de la matriz A[i][j]"<<endl;


cout<<"ingrese la fila de la matriz:";
cin>>n;

cout<<"ingrese la columna de la matriz:";


cin>>m;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{ cout<<"A["<<i<<"]"<<"["<<j<<"]:";
cin>>A[i][j];
if(i==j)
{ M[i]=A[i][j];
} //cout<<M[i]<<endl;
}
}
cout<<"los elementos de la diagonal principal son:"<<endl;
for(i=1;i<=n;i++)
cout<<M[i]<<endl;
return 0;
}

4. Desarrollar un programa que multiplique una matriz de nxm y luego


imprima la matriz resultante.

#include "iostream.h"

main()
{ int n,m,i,a,b,k,j,A[100][100],B[100][100],C[100][100];
cout<<"ingresando el orden de la matriz A[i][j]"<<endl;
cout<<"ingrese la fila de la matriz:";
cin>>n;
cout<<"ingrese la columna de la matriz:";
cin>>m;
for(i=1;i<=n;i++)
{ for(j=1;j<=m;j++)
{ cout<<"A["<<i<<"]"<<"["<<j<<"]:";
cin>>A[i][j];
}
}
cout<<"ingresando elementos de la matriz B"<<endl;
cout<<"ingrese la fila de la matriz";
cin>>a;
cout<<"ingrese la columna de la matriz";
cin>>b;
for(i=1;i<=a;i++)

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 80

{ for(j=1;j<=b;j++)
{ cout<<"B["<<i<<"]"<<"["<<j<<"]:";
cin>>B[i][j];
}
}
cout<<"multiplicando las dos matrices"<<endl;
if(m==a)
{ for(i=1;i<=n;i++)
{ for(j=1;j<=b;j++)
{ C[i][j]=0;
for(k=1;k<=m;k++)
{ C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
cout<<C[i][j]<<" ";
}
cout<<endl;
}
}
else
cout<<"no son compatibles las matrices"<<endl;
return 0;
}

5. Los resultados de las elecciones de alcaldias en Perú se esquematizaron en


una matriz como la que se muestra a continuación:

Partido  P1 P2 P3 P4 P5 P6 P0(Votos en
Departamento  blanco)
Lima
Arequipa

Tumbes

La matriz almacena el número de votos que obtuvo cada partido en el departamento


correspondiente, así como los votos en blanco en cada departamento.
Se desea conocer:
 Total de votos
 Total de votos por departamento, para comparar con una tabla que indica el
número de personas que deben votar por departamento con el fin de detectar en
que departamentos votó menos del 60% de la población electoral y tomar así
medidas de concientización cívica.

Número de personas que deben votar por estado:

Valle Cauca ... Caldas


 Que partido obtuvo el mayor número de votos
 ¿Cuál es el departamento con mayor número de abstenciones y cuál es el
departamento con mayor porcentaje de abstenciones?

Algoritmo implementado en C++.


#include <iostream.h>
#include <stdlib.h>
#define DPTOS 3

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 81

void main()
{ int votos[DPTOS][7],votantes[DPTOS],abstencion[DPTOS],total,i,j;
int maximo,max_indice;
system("CLS");
for(i=0;i<DPTOS;i++) {
for(j=0;j<=6;j++) {
if(j == 0) {
cout<<"Votos en blanco en el Dpto " <<i<<": ";
cin>>votos[i][j]; // Almacena los datos leidos en la matriz
}
else {
cout<<"Votos del partido P"<<j<<" en el Dpto "<<i<<": ";
cin>>votos[i][j]; // Almacena los datos leidos en la matriz
}
}
}
cout<<endl;
for(i=0;i<DPTOS;i++){
cout<<"Personas que deben votar en el Dpto "<<i<<": ";
cin>>votantes[i];
}
cout <<endl;
for(j=1;j<=6;j++){
total=0; // Variable acumuladora, por lo cual hay que inicializarla en 0
for(i=0;i<DPTOS;i++){
total = total+votos[i][j];
}
cout<<"Votos obtenidos por el partido P"<<j<<": "<<total<<endl;
}
cout<<endl;
// Suma la matriz por filas para dar el total de votos por departamento
maximo=0;
for(i=0;i<DPTOS;i++){
total=0; // Variable acumuladora, por lo cual hay que inicializarla en 0
for(j=0;j<=6;j++){
total=total+votos[i][j];
if(i==1 && maximo<votos[i][j]){ // Busca el partido de más votos en el segundo Dpto.
maximo=votos[i][j];
max_indice=j; // Almacena el índice del partido con más votos
}
}
abstencion[i]=votantes[i]-total; // Calcula la abstención de una vez
cout<<"Votos totales en el Dpto "<<i<<": "<<total;
cout<<"; Votó el "<<total*100/votantes[i]<<"% de la población."<<endl;
}
cout<<endl<<"El partido P"<<max_indice<<" obtuvo el mayor número de votos en el segundo
Dpto."<<endl<<endl;
maximo=0;
for(i=0;i<DPTOS;i++){
if(maximo<abstencion[i]){ // Busca el Dpto de más abstención
maximo=abstencion[i];
max_indice=i;
}
cout <<"Abstención de "<<abstencion[i]<<" en el Dpto "<<i<<", para un porcentaje de"
<<abstencion[i]*100/votantes[i]<<"% "<<endl;
}
cout<<endl<<"El partido con mayor abstención fue el Dpto "<<max_indice<<endl;
system("PAUSE");
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 82

6. Determinante de una matriz cuadrada


#include "iostream.h"
#include "iomanip.h"
main()
{
int i,j,k,l,m,n ;
float a[100][100];
float det;
cout<<"Ingrese el orden de la matriz";
cin>>n;

m=n-1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{ cout<<"A["<<i<<"]"<<"["<<j<<"]:";
cin>>a[i][j];
}
}

cout<<"imprimiendo los elementos de la matriz"<<endl ;


for(i=1;i<=n;i++)
{ cout<<"| ";
for(j=1;j<=n;j++)
{cout<<a[i][j]<<" ";
}
cout<<"|"<<endl;
}

det=a[1][1];
for(k=1;k<=m;k++)
{
l=k+1;
for(i=l;i<=n;i++)
{
for(j=l;j<=n;j++)
a[i][j] = ( a[k][k]*a[i][j]-a[k][j]*a[i][k] )/a[k][k]; }
det=det*a[k+1][k+1];
}
cout<<"la determinante de la matriz es: "<<det<<endl;
return 0;
}

7. Inversa de una matriz

#include<iostream.h>
#include<conio.h>
main(){
double A[100][100],B[100][100],C[100][100],R[100][100];

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 83

float U[100][100];
int i,j,k,l,m,n,tem,temporal,p;
cout<<"ingrese dimencion de matriz"; cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=2*n;j++)
{ A[i][j]=0 ;
if(j-i==n || i==j)
A[i][j]=1;
B[i][j]=A[i][j];
}
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=2*n;j++)
cout<<A[i][j]<<" ";
}
cout<<endl<<endl;

for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
cout<<i<<"-"<<j<<" : ";
cin>>A[i][j];
B[i][j]=A[i][j];
}
cout<<endl<<endl;

for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=2*n;j++)
cout<<A[i][j]<<" ";
}
//hasta aqui ingreso matrizzzz
i=1;
for(j=1;j<=n;j++){
if(i==j && i<=n){
for(m=1;m<=2*n;m++){
U[i][m]=A[i][m]/B[i][i];
C[i][m]=U[i][m];}
}
if(i==j&&i<=n){
for(k=1;k<=n;k++)
if(i!=k && i<=n){
for(m=i;m<=2*n;m++)
C[k][m]=A[k][m]-U[i][m]*B[k][i];
}
}
for(l=1;l<=n;l++)
for(p=1;p<=n*2;p++)
A[l][p]=C[l][p];

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.


Algorítmica para Programación Pág. 84

for(l=1;l<=n;l++)
for(p=1;p<=n*2;p++){
B[l][p]=A[l][p];
}
i++;
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n*2;j++)
cout<<U[i][j]<<" ";
}
cout<<endl<<endl;
for(i=1;i<=n;i++){
cout<<endl;
for(j=1;j<=n*2;j++)
cout<<A[i][j]<<" ";
}
cout<<endl;

getch();
}

Ingeniería Informática y Sistemas – UNAMBA Ing. Francisco Cari I.

También podría gustarte