Páginas

jueves, 19 de abril de 2012

!!!Algoritmos¡¡¡¡

Arreglos
Un arreglo es un conjunto de celdas de memoria relacionadas entre si ya que todos tienen el mismo nombre y almacenan el mismo tipo de datos para referirse a una celda en particular algún elemento dentro del arreglo y entre corchetes [] el numero de posición del elemento dentro del arreglo.
El primer elemento se almacena en la posición 0 del arreglo, es decir el primer elemento del arreglo se conoce como a[0], el segundo como a[1], el séptimo como a[6] y en general el elemento de orden i del arreglo a se conoce como a[i-1].
El número de posición que aparece dentro de los corchetes se conoce como índice y debe ser un número entero o una expresión entera, por ejemplo:
 printf ("%i", a[0]+a[5]+a[10]);

 x=a[7]/2;

 x=a[4]=12;
Para declarar un arreglo se emplea la siguiente sintaxis:
 tipo_de_dato nombre_del_arreglo [número de elementos];

 int a[12];

 float f[10];

 char nom_emp [30];
Ejemplo:
 #include <stdio.h>
 #include <conio.h>
 
 #define MAX 12
 
 void main(){
 
 int a[MAX], b[MAX], c[MAX], i, j=0, k=0;
 
 clrscr();
 
 printf ("Programa que almacena 12 numeros en un arreglo ");
 printf ("y luego los separa en dos de acuerdo a su valor.\n");
 
 for (i=0; i < MAX; i++){
  printf ("Introduce el valor %i: ", i+1);
  scanf ("%i", &a[i]);
 }
 
 for (i=0; i < MAX; i++)
 
  if (a[i] < MAX){
  
   b[j] = a[i];
   j++;
  }

  else {
  
   c[k] = a[i];
   k++;
  }

 printf ("\nLos numeros quedan asi:\n\n");
 
  for (i=0; i < j; i++)
   printf ("%i\n", b[i]);

  for (i=0; i < k; i++)
   printf ("\t%i\n", c[i]);

 getch();
 }
Arriba
Algoritmo de ordenamiento Burbuja
Este algoritmo compara elementos consecutivos del arreglo uno con respecto del otro, si es mayor o menor según el tipo de ordenamiento y los cambia de posición. Este proceso se repite recorriendo todo el arreglo para posicionar un solo dato, por lo que es necesario repetirlo para los demás datos del arreglo. Su implementación es la siguiente:
 #include <stdio.h>
 #include <conio.h>
 #include <stdlib.h>

 #define TAM 10

 void main(){
 int a[TAM], temp, i, j;

 clrscr();

 randomize(); //Inicializa el generador de numeros aleatorios

 printf ("Llenando arreglo con números aleatorios\n");
 
 for (i=0; i< TAM; i++)
  a[i]=random(100);

 //Implementacion de Ordenamiento por burbuja de mayor a menor

 for (j=1; j <= TAM; j++)

  for (i=0; i< TAM-1; i++)

   if (a[i] < a[i+1]){

    temp = a[i];
    a[i] = a[i+1];
    a[i+1] = temp;
   }

 printf ("\nArreglo ordenado\n");

 for (i=0; i< TAM; i++)
  printf ("a[%d] = %d\n", i, a[i]);

 getch();
 }
Arriba
Busqueda Secuencial
Este algoritmo compara uno a uno los elementos del arreglo hasta recorrerlo por completo indicando si el número buscado existe. Su implementación es la siguiente:
 #include <stdio.h>
 #include <conio.h>
 #include <stdlib.h>

 #define TAM 10

 void main(){
 int a[TAM], temp, i, j, num;

 clrscr();

 randomize(); //Inicializa el generador de numeros aleatorios

 printf ("Llenando arreglo con números aleatorios\n");

 for (i=0; i< TAM; i++)
  a[i]=random(100);

 printf ("Numero a buscar? ");
 scanf ("%d", &num);
 
 for (i=0; i< TAM; i++)
  if (a[i] == num){
  
   printf ("\nValor encontrado");
   printf ("\nPosicion: %d", i);
  }
 
  else
   printf ("\nNo existe");

 printf ("El arreglo era:\n");

 for (i=0; i< TAM; i++)
  printf ("%d ", a[i]);
 
 getch();
 }
Arriba
Busqueda Binaria
Este algoritmo permite buscar de una manera más eficiente un dato dentro de un arreglo, para hacer esto se determina el elemento central del arreglo y se compara con el valor que se esta buscando, si coincide termina la busqueda y en caso de no ser asi se determina si el dato es mayor o menor que el elemento central, de esta forma se elimina una mitad del arreglo junto con el elemento central para repetir el proceso hasta encontrarlo o tener solo un elemento en el arreglo. Para poder aplicar este algorimo se requiere que el arreglo este ordenado. Su implementación es la siguiente:
 #include <stdio.h>
 #include <conio.h>
 #include <stdlib.h>

 #define TAM 15

 void main(){

 int a[TAM], busca, temp, bajo, alto, central;

 printf("Llenando el arreglo con números aleatorios\n");

 randomize(); //Inicializa el generador de aleatorios

 for (int i=0; i< TAM; i++)
  a[i]=random(100);

 //Implementacion de Ordenamiento por burbuja de menor a mayor
 printf ("Ordenando arreglo...\n");

 for (int j=1; j <= TAM; j++)
  for (i=0; i< TAM-1; i++)

   if (a[i] > a[i+1]){

       temp = a[i];
       a[i] = a[i+1];
       a[i+1] = temp;
   }

 //Implementacion de busqueda binaria

 printf ("\nIntroduce un numero a buscar: ");
 scanf ("%d", &busca);

 bajo = 0;
 alto = TAM-1;
 central = (bajo+alto)/2;

 while (bajo < alto && busca != a[central]){

  if(busca > a[central])
   bajo = central+1;

  else
   alto = central-1;

  central=(bajo+alto)/2;
 }

 if (busca == a[central])
  printf("\n%d encontrado en posicion %d", busca, central);

 else
  printf("\n%d no existe", busca);

 printf ("\n\nEl arreglo ordenado era\n\n");

 for (i=0; i< TAM; i++)
  printf ("%d ", a[i]);

 getch();
 }
Arriba
Estructuras de datos
Las estructuras se definen como conjuntos de datos de diferente tipo. Se pueden declarar de las siguentes maneras:
 struct nomina
 {
  char nom[80];
  char puesto[40];
  float sueldo;
  int id;
 } 
 
 struct nomina empleado_1, empleado_2, empleado[50];
 
 struct
 {
  char nom[80];
  char puesto[40];
  float sueldo;
  int id;  
 }
 
 empleado_1, empleado_2, empleado[50];
 
 typedef struct
 {
  char nom[80];
  char puesto[40];
  float sueldo:
  int id;
 } nomina;
 
 nomina empleado_1; empleado_2; empleado[50];
Las estructuras, como cualquier otro tipo de dato, se pueden representar en arreglos.
 #include 
 struct
 {
  char nom[60];
  char mat[40];
  float cb, pc, cf;
  flat prom;
 } alumno[50];
 
 float aux;
 
 void main()
 {
  int i, n;
  printf ("Cuantos alumnos? ");
  scanf ("%d", &n);
  flushall();
  printf ("\nLectura de datos");
 }

miércoles, 11 de abril de 2012

El algoritmo de ordenación tal vez más sencillo sea el denominado de intercambio que ordena los
elementos de una lista en orden ascendente. Este algoritmo se basa en la lectura sucesiva de la lista
a ordenar, comparando el elemento inferior de la lista con los restantes y efectuando intercambio de
posiciones cuando el orden resultante de la comparación no sea el correcto.
El algoritmo se ilustra con la lista original 8, 4, 6, 2 que ha de convertirse en la lista ordenada
2, 4, 6, 8. El algoritmo realiza n − 1 pasadas (3 en el ejemplo), siendo n el número de elementos, y
ejecuta las siguientes operaciones.

ALGORITMOS DE ORDENACIÓN BÁSICOs

Existen diferentes algoritmos de ordenación elementales o básicos cuyos detalles de implementación
se pueden encontrar en diferentes libros de algoritmos. La enciclopedia de referencia es
[KNUTH 1973]1 y sobre todo la 2.a edición publicada en el año 1998 [KNUTH 1998]2. Los algoritmos
presentan diferencias entre ellos que los convierten en más o menos eficientes y prácticos
según sea la rapidez y eficiencia demostrada por cada uno de ellos. Los algoritmos básicos de
ordenación más simples y clásicos son:
• Ordenación por selección.
• Ordenación por inserción.
• Ordenación por burbuja.
Los métodos más recomendados son: selección e inserción, aunque se estudiará el método de
burbuja, por aquello de ser el más sencillo aunque a la par también es el más ineficiente; por esta
causa no recomendamos su uso, pero sí conocer su técnica.
Los datos se pueden almacenar en memoria central o en archivos de datos externos guardados
en unidades de almacenamiento magnético (discos, cintas, disquetes, CD-ROM, DVD, discos flash
USB, etc.) Cuando los datos se guardan en listas y en pequeñas cantidades, se suelen almacenar de
modo temporal en arrays y registros; estos datos se almacenan exclusivamente para tratamientos
internos que se utilizan en gestión masiva de datos y se guardan en arrays de una o varias dimensiones.
Los datos, sin embargo, se almacenan


Métodos de ordenamiento y búsqueda.

ORDENACIÓN
La ordenación o clasificación de datos (sort, en inglés) es una operación consistente en disponer
un conjunto —estructura— de datos en algún determinado orden con respecto a uno de los campos
de elementos del conjunto. Por ejemplo, cada elemento del conjunto de datos de una guía telefónica
tiene un campo nombre, un campo dirección y un campo número de teléfono; la guía telefónica está
dispuesta en orden alfabético de nombres; los elementos numéricos se pueden ordenar en orden
creciente o decreciente de acuerdo al valor numérico del elemento. En terminología de ordenación,
el elemento por el cual está ordenado un conjunto de datos (o se está buscando) se denomina clave.
Una colección de datos (estructura) puede ser almacenada en un archivo, un array (vector o
tabla), un array de registros, una lista enlazada o un árbol. Cuando los datos están almacenados en
un array, una lista enlazada o un árbol, se denomina ordenación interna. Si los datos están almacenados
en un archivo, el proceso de ordenación se llama ordenación externa.
Una lista se dice que está ordenada por la clave k si la lista está en orden ascendente o descendente
con respecto a esta clave. La lista se dice que está en orden ascendente si:
i < j implica que k[i] <= k[j]
y se dice que está en orden descendente si:
i > j implica que k[i] <= k[j]
para todos los elementos de la lista. Por ejemplo, para una guía telefónica, la lista está clasificada en
orden ascendente por el campo clave k, donde k[i] es el nombre del abonado (apellidos, nombre).
4 5 14 21 32 45 orden ascendente
75 70 35 16 14 12 orden descendente
Zacarias Rodriguez Martinez Lopez Garcia orden descendente
Los métodos (algoritmos) de ordenación son numerosos, por ello se debe prestar especial atención
en su elección. ¿Cómo se sabe cuál es el mejor algoritmo? La eficiencia es el factor que mide
la calidad y rendimiento de un algoritmo. En el caso de la operación de ordenación, dos criterios se
suelen seguir a la hora de decidir qué algoritmo —de entre los que resuelven la ordenación— es el
más eficiente: 1) tiempo menor de ejecución en computadora; 2) menor número de instrucciones.
Sin embargo, no siempre es fácil efectuar estas medidas: puede no disponerse de instrucciones para
medida de tiempo —aunque no sea éste el caso del lenguaje C—, y las instrucciones pueden variar,
dependiendo del lenguaje y del propio estilo del programador. Por esta razón, el mejor criterio para
medir la eficiencia de un algoritmo es aislar una operación específica clave en la ordenación y
contar el número de veces que se realiza. Así, en el caso de los algoritmos de ordenación, se
utilizará como medida de su eficiencia el número de comparaciones entre elementos efectuados. El
algoritmo de ordenación A será más eficiente que el B, si requiere menor número de comparaciones.
166 Algoritmos y estructuras de datos
Así, en el caso de ordenar los elementos de un vector, el número de comparaciones será función del
número de elementos (n) del vector (array). Por consiguiente, se puede expresar el número de
comparaciones en términos de n (por ejemplo, n+4, o bien n2 en lugar de números enteros (por
ejemplo, 325).
En todos los métodos de este capítulo, normalmente —para comodidad del lector— se utiliza el
orden ascendente sobre vectores o listas (arrays unidimensionales).
Los métodos de ordenación se suelen dividir en dos grandes grupos:
• directos burbuja, selección, inserción
• indirectos (avanzados) Shell, ordenación rápida, ordenación por mezcla, Radixsort
En el caso de listas pequeñas, los métodos directos se muestran eficientes, sobre todo porque los
algoritmos son sencillos; su uso es muy frecuente. Sin embargo, en listas grandes estos métodos se
muestran ineficaces y es preciso recurrir a los métodos avanzados.