Anda di halaman 1dari 9

PROGRAMACION I

METODOS DE ORDENAMIENTO
Debido a que las estructuras de datos son utilizadas para almacenar informacin, para poder
recuperar esa informacin de manera eficiente es deseable que aquella est ordenada. Existen
varios mtodos para ordenar las diferentes estructuras de datos bsicas.

En general los mtodos de ordenamiento no son utilizados con frecuencia, en algunos casos
slo una vez. Hay mtodos muy simples de implementar que son tiles en los casos en dnde
el nmero de elementos a ordenar no es muy grande (ej, menos de 500 elementos). Por otro
lado hay mtodos sofisticados, ms difciles de implementar pero que son ms eficientes en
cuestin de tiempo de ejecucin.

Los mtodos sencillos por lo general requieren de aproximadamente n x n pasos para ordenar
n elementos.

Los mtodos simples son: insertion sort (o por insercin directa) selection sort, bubble sort, y
shellsort, en dnde el ltimo es una extensn al insertion sort, siendo ms rpido. Los mtodos
ms complejos son el quick-sort, el heap sort, radix y address-calculation sort. 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 numrico, alfabtico o incluso alfanumrico,
ascendente o descendente.

Se ha dicho que el ordenamiento puede efectuarse moviendo los registros con las claves. El
mover un registo completo implica un costo, el cual se incrementa conforme sea mayor el
tamao del registro. Es por ello que es deseable evitar al mximo el movimiento de los
registros. Una alternativa es el crear una tabla de referencias a los registros y mover las
referencias y no los datos. A continuacin se mostrarn los mtodos de ordenamiento
empezando por el ms sencillo y avanzando hacia los mas sofisticados

La eficiencia de los algoritmos se mide por el nmero de comparaciones e intercambios que


tienen que hacer, es decir, se toma n como el nmero de elementos que tiene el arreglo a
ordenar y se dice que un algoritmo realiza O(n2) comparaciones cuando compara n veces los n
elementos, n x n = n2.

ORDENAMIENTO DE BURBUJA

La Ordenacin de burbuja (Bubble Sort en ingls) es un sencillo algoritmo de ordenamiento.


Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente,
intercambindolos de posicin si estn en el orden equivocado. Es necesario revisar varias
veces toda la lista hasta que no se necesiten ms intercambios, lo cual significa que la lista est
ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los
elementos durante los intercambios, como si fueran pequeas "burbujas". Tambin es
conocido como el mtodo del intercambio directo. Dado que solo usa comparaciones para
operar elementos, se lo considera un algoritmo de comparacin, siendo el ms sencillo de
implementar.

#include<stdio.h>
int main ()
{
int aux,i,j,k;
int n=10,A[n];

ING. LUIS AYLAS


PROGRAMACION I

for (i=0; i<n; i++)


{
printf("dame el dato %dn",i+1);
scanf("%d",&A);
}
for (i=0;i<n;i++)
{
for (j=0;j<n-i;j++)
{
if (A[j]>=A[j+1])
{
aux=A[j];
A[j]=A[j+1];
A[j+1]=aux;
}

}
for (k=0;k<n;k++)
{
printf(" %d",A[k]);
}

return 0;
}

ORDENAMIENTO SHELL

El ordenamiento Shell (Shell sort en ingls) es un algoritmo de ordenamiento. El mtodo se


denomina Shell en honor de su inventor Donald Shell. Su implementacin original, requiere
O(n2) comparaciones e intercambios en el peor caso. Un cambio menor presentado en el libro
de V. Pratt produce una implementacin con un rendimiento de O(n log2 n) en el peor caso.
Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el
ptimo O(n log n). Aunque es fcil desarrollar un sentido intuitivo de cmo funciona este
algoritmo, es muy difcil analizar su tiempo de ejecucin.

El algoritmo Shell sort mejora el ordenamiento por insercin comparando elementos


separados por un espacio de varias posiciones. Esto permite que un elemento haga "pasos ms
grandes" hacia su posicin esperada. Los pasos mltiples sobre los datos se hacen con tamaos
de espacio cada vez ms pequeos. El ltimo paso del Shell sort es un simple ordenamiento
por insercin, pero para entonces, ya est garantizado que los datos del vector estn casi
ordenados.

#include <iostream>
using namespace std;
void shell(int array[], int size)
{

ING. LUIS AYLAS


PROGRAMACION I

int i, j, intervalo, temp;


intervalo = size/2;
while (intervalo > 0) {
for (i=intervalo; i < size; i++) {
j = i;
temp = array[i];
while ((j >= intervalo) && (array[j - intervalo] > temp)) {
array[j] = array[j - intervalo];
j = j - intervalo;
}
array[j] = temp;
}
intervalo /= 2;
}
}
int main (int argc, char * const argv[]) {
int numeros[] = {45, 27, 53, 17, 73, 56, 49, 19, 31, 34, 75, 45, 67, 21, 34, 12};
for (int i = 0; i < 16; ++i) {
cout << numeros[i] << " ";
}
cout << endl;
shell(numeros, 16);
for (int i = 0; i < 16; ++i){
cout << numeros[i] << " ";
}
cout << endl;
}

ORDENAMIENTO POR INSERCION

El ordenamiento por insercin (insertion sort en ingls) es una manera muy natural de ordenar
para un ser humano, y puede usarse fcilmente para ordenar un mazo de cartas numeradas en
forma arbitraria. Requiere O(n) operaciones para ordenar una lista de n elementos.

Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado. Despus,


cuando hay k elementos ordenados de menor a mayor, se toma el elemento k+1 y se compara
con todos los elementos ya ordenados, detenindose cuando se encuentra un elemento menor
(todos los elementos mayores han sido desplazados una posicin a la derecha) o cuando ya no
se encuentran elementos (todos los elementos fueron desplazados y este es el ms pequeo).
En este punto se inserta el elemento k+1 debiendo desplazarse los dems elementos.

#include<stdio.h>
#include<conio.h>
int a[4]={4,1,7,2};
int n=4;
int i,j,x;
main()
{

ING. LUIS AYLAS


PROGRAMACION I

for(i=1;i<n;i++)
{
j=i;
x=a;
while(j>0 && x<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=x;
}
for(i=0;i<4;i++)
{
printf("%d",a);
}
getch();
}

ORDENAMIENTO POR SELECCIN

Buscas el elemento ms pequeo de la lista.


Lo intercambias con el elemento ubicado en la primera posicin de la lista.
Buscas el segundo elemento ms pequeo de la lista.
Lo intercambias con el elemento que ocupa la segunda posicin en la lista.
Repites este proceso hasta que hayas ordenado toda la lista.

#include<iostream>
using namespace std;
#define largo 50
void seleccionsort (int A[], int n)
{
int min,i,j,aux;
for (i=0; i<n-1; i++)
{
min=i;
for(j=i+1; j<n; j++)
if(A[min] > A[j])
min=j;
aux=A[min];
A[min]=A[i];
A[i]=aux ;
}

}
void main ()
{
int A[largo],n;

ING. LUIS AYLAS


PROGRAMACION I

do{
cout<<"Cantidad de numeros a ingresar: ";cin>>n;
if(n<=0||n>largo)
cout<<"Debe ingresar un valor > a 0 y < a
"<<largo<<endl;
}while(n<=0||n>largo);

leeCadena(n,A);
seleccionsort(A,n);
muestraCadena(n,A);

}
#include<iostream>
using namespace std;
void leeCadena(int cant,int n[])
{
int i;
for(i=0;i<cant;i++)
{
cout<<"Ingresa numero "<<i+1<<": ";
cin>>n[i];
}

void muestraCadena(int cant,int n[])


{
int i;
for(i=0;i<cant;i++)
{
cout<<n[i]<<endl;
}
}

ORDENAMIENTO HEAP SORT

El ordenamiento por montculos (Heap sort) es un algoritmo de ordenacin no


recursivo, no estable, con complejidad computacional O(n log n).
Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un
montculo (heap), y luego extraer el nodo que queda como nodo raz del montculo (cima) en
sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en
una propiedad de los montculos, por la cual, la cima contiene
siempre el menor elemento (o el mayor, segn se haya definido el montculo) de todos
los almacenados en l.
El significado de heap en ciencia computacional es el de una cola de prioridades
(priority queue). Tiene las siguientes caractersticas:
Un heap es un arreglo de n posiciones ocupado por los elementos de la cola.
(Nota: se utiliza un arreglo que inicia en la posicin 1 y no en cero, de tal

ING. LUIS AYLAS


PROGRAMACION I

manera que al implementarla en C se tienen n+1 posiciones en el arreglo.)

Se mapea un rbol binario de tal manera en el arreglo que el nodo en la posicin


i es el padre de los nodos en las posiciones (2*i) y (2*i+1).
El valor en un nodo es mayor o igual a los valores de sus hijos. Por consiguiente,
el nodo padre tiene el mayor valor de todo su subrbol.

#include <iostream>
#define max 100
using namespace std;
int main()
{
int A[max],j,item,temp,i,k,n;
cout<<"Ingresa la cantidad de elementos del arreglo: ";
cin>>n;
for(i=1;i<=n;i++)
cin >> A[i];
for(k=n;k>0;k--)
{
for(i=1;i<=k;i++)
{
item=A[i];
j=i/2;
while(j>0 && A[j]<item)
{
A[i]=A[j];
i=j;
j=j/2;
}
A[i]=item;
}
temp=A[1];
A[1]=A[k];
A[k]=temp;
}
cout<<"El orden es:"<<endl;
for(i=1;i<=n;i++)
cout<<A[i] << endl;
return 0;
}

ING. LUIS AYLAS


PROGRAMACION I

MATRICES

Ejemplo 1

#include <iostream>
using namespace std;
const int MaxDimensiones = 2;
int main()
{
int v[][MaxDimensiones] = { 1, 2, 3, 4 };
for(int i = 0; i < MaxDimensiones; ++i) {
for(int j = 0; j < MaxDimensiones; ++j) {
cout << v[ i ][ j ] << endl;
}
}
return 0;
}

Ejemplo 2

Hacer un programa en lenguaje c que imprima la suma de cada una de las columnas de una
matriz 5x5

#include <stdio.h>
#define n 3
int main ()
{
int matriz[n][n],i,j,suma =0;
printf("introduzca los valores");

for(i=0;i<n;i++)
for(j=0;j<n;j++)

scanf("%d",&matriz [i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
suma =suma + matriz[j][i];
printf("%d",suma);
suma=0;
i=0;
j=j+1;
}

ING. LUIS AYLAS


PROGRAMACION I

Ejemplo 3

Matriz de nxn

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
int A[50][50];
int i,j,m,n;

cout<<"Ingrese dimensiones de la matriz: ";


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

cout<<"\n Matriz A: \n";


{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<"\t"<<A[i][j];
}
cout<<"\n";
}
cout<<"\n";
}

system("PAUSE>nul");
return 0;
}

Ejemplo 4

Matriz de 3x3

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

main()
{
int i1,i2;
int a=30,b=40;
int monto[3][2]={{1,4,5,},{45,33,66}};
for (i1=0 ; i1<2 ; i1++)
for (i2=0 ; i2<3 ; i2++)
{

ING. LUIS AYLAS


PROGRAMACION I

printf("El dato de Coordenada %d,%d",i1,i2);


printf("es: %d\n",monto[i1][i2]);
if ((monto[i1][i2]>a)&&(monto[i1][i2]<b))
printf("\nEl Valor %d Estas en el rango Seleccionado(%d-
%d)\n",monto[i1][i2],a,b);
}
printf("\n\n");
system("pause");
}
Ejemplo 5
Suma de matrices
#include<iostream>
using namespace std;
int main(){
int m,n;
cin>>m>>n;
int A[m][n],B[m][n],C[m][n];
for( int i=0;i<m;i++){
for(int j=0;j<n;j++){
cout<<"A["<<i<<"]["<<j<<"]:";
cin>>A[i][j];
}
}
for( int i=0;i<m;i++){
for(int j=0;j<n;j++){
cout<<"B["<<i<<"]["<<j<<"]:";
cin>>B[i][j];
}
}
for( int i=0;i<m;i++){
for(int j=0;j<n;j++){
C[i][j]=A[i][j]+B[i][j];
}
}
for( int i=0;i<m;i++){
for(int j=0;j<n;j++){

cout<<C[i][j]<<endl;
}
}
}

ING. LUIS AYLAS

Anda mungkin juga menyukai