Vous êtes sur la page 1sur 24

INSTITUTO TECNOLOGICO SUPERIOR DE FELIPE CARRILLO

PUERTO

UNIDAD ACADEMICA TULUM

INGENIERIA EN SISTEMAS COMPUTACIONALES

ESTRUCTURA DE DATOS

DOCENTE: YOLANDA

ALUMNO: RUBEN ISAI VAZQUEZ DE LEON

3er. SEMESTRE, GRUPO A

INTRODUCCION A LA ESTRUCTURA DE DATOS:


Tipos de datos abstractos:
Un tipo de dato abstracto (TDA) o Tipo abstracto de datos (TAD) es un modelo
matemtico compuesto por una coleccin de operaciones definidas sobre un conjunto de
datos para el modelo, con mucha frecuencia se utilizan los trminos TDA y Abstraccin de
Datos de manera equivalente, y esto es debido a la similitud e interdependencia de ambos. Sin
embargo, es importante definir por separado los dos conceptos.
Como ya se mencion, los Lenguajes de Programacin Orientados a Objetos son lenguajes
formados por diferentes mtodos o funciones y que son llamados en el orden en que el programa
lo requiere, o el usuario lo desea. La abstraccin de datos consiste en ocultar las caractersticas de
un objeto y obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro
programa. Esto es similar a una situacin de la vida cotidiana. Cuando yo digo la palabra perro,
usted no necesita que yo le diga lo que hace el perro. Usted ya sabe la forma que tiene un perro y
tambin sabe que los perros ladran. De manera que yo abstraigo todas las caractersticas de todos
los perros en un solo trmino, al cual llamo perro. A esto se le llama Abstraccin y es un
concepto muy til en la programacin, ya que un usuario no necesita mencionar todas las
caractersticas y funciones de un objeto cada vez que ste se utiliza, sino que son declaradas por
separado en el programa y simplemente se utiliza el trmino abstracto (perro) para mencionarlo.
En el ejemplo anterior, perro es un Tipo de Dato Abstracto y todo el proceso de definirlo,
implementarlo y mencionarlo es a lo que llamamos Abstraccin de Datos.
Vamos a poner un ejemplo real de la programacin. Supongamos que en algn Lenguaje de
Programacin Orientado a Objetos un pequeo programa saca el rea de un rectngulo de las
dimensiones que un usuario decida. Pensemos tambin que el usuario probablemente quiera
saber el rea de varios rectngulos. Sera muy tedioso para el programador definir la multiplicacin
de base por altura varias veces en el programa, adems que limitara al usuario a sacar un
nmero determinado de reas. Por ello, el programador puede crear una funcin denominada
rea, la cual va a ser llamada el nmero de veces que sean necesitadas por el usuario y as el
programador se evita mucho trabajo, el programa resulta ms rpido, ms eficiente y de menor
longitud. Para lograr esto, se crea el mtodo rea de una manera separada de la interfaz grfica
presentada al usuario y se estipula ah la operacin a realizar, devolviendo el valor de la
multiplicacin. En el mtodo principal solamente se llama a la funcin rea y el programa hace el
resto.
Al hecho de guardar todas las caractersticas y habilidades de un objeto por separado se le llama
Encapsulamiento y es tambin un concepto importante para entender la estructuracin de datos.
Es frecuente que el Encapsulamiento sea usado como un sinnimo del Ocultacin de informacin,
aunque algunos creen que no es as.

Veamos los diferentes tipos de abstraccin que podemos encontrar en un programa:

1. Abstraccin funcional: crear procedimientos y funciones e invocarlos mediante un nombre


donde se destaca qu hace la funcin y se ignora cmo lo hace. El usuario slo necesita conocer
la especificacin de la abstraccin (el qu) y puede ignorar el resto de los detalles (el cmo).

2. Abstraccin de datos:

Tipo de datos: proporcionado por los leguajes de alto nivel. La representacin usada es
invisible al programador, al cual solo se le permite ver las operaciones predefinidas para cada
tipo.

Tipos definidos: por el programador que posibilitan la definicin de valores de datos ms


cercanos al problema que se pretende resolver.

TDA: para la definicin y representacin de tipos de datos (valores + operaciones), junto con
sus propiedades.

Objetos: Son TDA a los que se aade propiedades de reutilizacin y de comparticin de


cdigo.

MANEJO DE MEMORIA ESTTICA Y DINMICA:


Manejo de Memoria:
El problema con la memoria esttica de memoria es que siempre se reserva antes de conocer los
datos concretos del problema y esto origina reservar siempre un mximo de memoria que en la
mayora de las veces no se va a necesitar.

Memoria dinmica:
La reserva de memoria dinmica se hace en tiempo de ejecucin despus de leer los datos y de
conocer el tamao exacto del problema. Como consecuencia se adapta mucho mejor a las
necesidades en cada caso.

El sitio donde se almacenan los objetos se denominan en ingles heap o free store traducido como
montculo o memoria libre, y el sitio preciso donde se encuentre depende del compilador y el tipo
de puntero utilizado. La creacin y destruccin de los objetos est en manos del programador a
travs de los operadores new y delate.

En C# las variables que se declaran son punteros y se pasan eficientemente con referencia,
tampoco es necesario considerar la liberacin de la memoria puesto que framework se encarga de
liberar todas las referencias que no se estn utilizando y compactar la memoria para mejorar el
rendimiento.

Memoria Esttica
La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de ejecucin
es en memoria esttica o permanente a lo largo de toda la ejecucin del programa.

Ventajas de utilizar memoria dinmica vs memoria esttica


La memoria dinmica sirve para que los programadores se adapten siempre al tamao del
problema que tienen que resolver sin desperdiciar recursos de memoria y esto se traduce en una
mayor eficiencia en la ejecucin de los programas, las ventajas de utilizar memoria dinmica se
valoran mejor en comparacin con la utilizacin de la reserva de la memoria esttica, como se
muestra en el siguiente cuadro.

Ejemplo de uso de la memoria esttica:

using System;
using System.Collections.Generic;
using System. Text;

namespace ConsoleApplication1

{
class Csimple
{
static void Main(string[] args)
{
int[] numeros = new int[] { 1, 2, 3, 4, 5 };
for (int i = 0; i <>
Console.WriteLine("Numero:{0}={1}", i + 1, numeros[i]);
Console.ReadLine();
}
}
}

Ejemplo de uso de memoria dinmica:


using System;
namespace Circunferencia1
{
class CircunferenciaApp
{
public static void Main()
{
const double PI=3.1415926; // Esto es una constante
double Radio=4; // Esto es una variable
Console.WriteLine("El permetro de una circunferencia de radio {0} es {1}", Radio,
2*PI*Radio);
Console.WriteLine("El rea de un crculo de radio {0} es {1}", Radio,
PI*Math.Pow(Radio,2));

}
}
}
La salida en la consola de este programa sera la siguiente:
El permetro de una circunferencia de radio 4 es 25,1327408
El rea de un crculo de radio 4 es 50,2654816
}
RECURSIVIDAD:
Concepto de recursividad:
La recursividad es una tcnica de programacin importante. Se utiliza para realizar una llamada a
una funcin desde la misma funcin. Como ejemplo til se puede presentar el clculo de nmeros
factoriales. l factorial de 0 es, por definicin, 1. Los factoriales de nmeros mayores se calculan
mediante la multiplicacin de 1 * 2 * , incrementando el nmero de 1 en 1 hasta llegar al nmero
para el que se est calculando el factorial.
El siguiente prrafo muestra una funcin, expresada con palabras, que calcula una factorial.
Si el nmero es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero.
Si el nmero es cero, su factorial es uno. Si el nmero es mayor que cero, se multiplica por l
factorial del nmero menor inmediato.
Para calcular el factorial de cualquier nmero mayor que cero hay que calcular como mnimo el
factorial de otro nmero. La funcin que se utiliza es la funcin en la que se encuentra en estos
momentos, esta funcin debe llamarse a s misma para el nmero menor inmediato, para poder
ejecutarse en el nmero actual. Esto es un ejemplo de recursividad.
La recursividad es un concepto importante en informtica. Muchos algoritmos se pueden describir
mejor en trminos de recursividad.
Supongamos que P es un procedimiento que contiene una sentencia de Llamada a s mismo o una
sentencia de Llamada a un segundo procedimiento que puede eventualmente llamar de vuelta al
procedimiento original P. Entonces P se dice que es u procedimiento recursivo. Como el programa
no ha de continuar ejecutndose indefinidamente, un procedimiento recursivo ha de tener las dos
siguientes propiedades:
(1) Debe existir un cierto criterio, llamado criterio base, por el que el procedimiento no se llama as
mismo.
(2) Cada vez que el procedimiento se llame a si mismo(directa o indirectamente), debe estar ms
cerca del criterio base.
Un procedimiento recursivo con estas dos propiedades se dice que est bien definido.
Similarmente, una funcin se dice que est definido recursivamente si la definicin de la funcin se
refiere a s misma. De nuevo, para que la definicin no sea circular, debe tener las dos siguientes
propiedades:
(1) Debe haber ciertos argumentos, llamados valores base, para los que la funcin no se refiera a
s misma.
(2) Cada vez que la funcin se refiera a s misma, el argumento de la funcin debe acercarse ms
al valor base.
Una funcin recursiva con estas dos propiedades se dice tambin que est bien definida.
Tipos.
Podemos distinguir dos tipos de recursividad:
Directa: Cuando un subprograma se llama a s mismo una o ms veces directamente. Indirecta:
Cuando se definen una serie de subprogramas usndose unos a otros.

Caractersticas.
Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y un a condicin
de terminacin. La parte recursiva y la condicin de terminacin siempre existen. En cambio la
parte no recursiva puede coincidir con la condicin de terminacin. Algo muy importante a tener en
cuenta cuando usemos la recursividad es que es necesario asegurarnos que llega un momento en
que no hacemos ms llamadas recursivas. Si no se cumple esta condicin el programa no parar
nunca.
Ventajas e inconvenientes. La principal ventaja es la simplicidad de comprensin y su gran
potencia, favoreciendo la resolucin de problemas de manera natural, sencilla y elegante; y
facilidad para comprobar y convencerse de que la solucin del problema es correcta. El principal
inconveniente es la ineficiencia tanto en tiempo como en memoria, dado que para permitir su uso
es necesario transformar el programa recursivo en otro iterativo, que utiliza bucles y pilas para
almacenar las variables.

Ejemplos de casos recursivos:


Barbero dormiln:
En ciencias de la computacin, el problema del barbero durmiente es un problema de
sincronizacin. El problema consiste en una barbera en la que trabaja un barbero que tiene un
nico silln de barbero y varias sillas para esperar. Cuando no hay clientes, el barbero se sienta en
una silla y se duerme. Cuando llega un nuevo cliente, ste o bien despierta al barbero o si el
barbero est afeitando a otro cliente se sienta en una silla (o se va si todas las sillas estn
ocupadas por clientes esperando). El problema consiste en realizar la actividad del barbero sin que
ocurran condiciones de carrera. La solucin implica el uso de semforos y objetos de exclusin
mutua para proteger la seccin crtica.
Un semforo es una variable protegida (o tipo abstracto de datos) que constituye el mtodo clsico
para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de
almacenamiento) en un entorno de multiprocesamiento. Fueron inventados por Edsger Dijkstra y se
usaron por primera vez en el sistema operativo THEOS.
En electrnica y en programacin concurrente, se conoce como condicin de carrera al error que
se produce en programas o circuitos lgicos que no se han construido adecuadamente para su
ejecucin simultnea con otros procesos.
https://www.youtube.com/watch?v=6hvYBJpEQRE

La cena de los filsofos:


El problema de los filsofos cenando es un problema clsico de las ciencias de la
computacin propuesto por Edsger Dijkstra en 1965para representar el problema de la
sincronizacin de procesos en un sistema operativo. Cabe aclarar que la interpretacin est
basada en pensadores chinos, quienes coman con dos palillos, donde es ms lgico que se
necesite el del comensal que se siente al lado para poder comer.

Cinco filsofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. Cada
filsofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Para comer los fideos son
necesarios dos tenedores y cada filsofo slo puede tomar los que estn a su izquierda y derecha.
Si cualquier filsofo toma un tenedor y el otro est ocupado, se quedar esperando, con el tenedor
en la mano, hasta que pueda tomar el otro tenedor, para luego empezar a comer.
Si dos filsofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condicin
de carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer.
Si todos los filsofos toman el tenedor que est a su derecha al mismo tiempo, entonces todos se
quedarn esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo
har porque todos se encuentran en la misma situacin (esperando que alguno deje sus
tenedores). Entonces los filsofos se morirn de hambre. Este bloqueo mutuo se denomina
interbloqueo o deadlock.
El problema consiste en encontrar un algoritmo que permita que los filsofos nunca se mueran de
hambre.
https://www.youtube.com/watch?v=i1RfAyyFQ0w

ESTRUCTURAS LINEALES:
Las estructuras lineales de datos se caracterizan porque sus elementos estn en secuencia,
relacionados en forma lineal, uno luego del otro.
Cada elemento de la estructura puede estar conformado por uno o varios subelementos o campos
que pueden pertenecer a cualquier tipo de dato, pero que normalmente son tipos bsicos.

Listas:
es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras
estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de
datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior. El
principal beneficio de las listas enlazadas respecto a los vectores convencionales es que el orden
de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el
disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.
Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o enlace (en
ingls link, del mismo significado) a otro dato del mismo tipo. Las listas enlazadas permiten
inserciones y eliminacin de nodos en cualquier punto de la lista en tiempo constante (suponiendo

que dicho punto est previamente identificado o localizado), pero no permiten un acceso aleatorio.
Existen diferentes tipos de listas enlazadas: listas enlazadas simples, listas doblemente enlazadas,
listas enlazadas circulares y listas enlazadas doblemente circulares.
Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales
como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para
acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales
como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas.

Colas:
Una cola constituye una estructura lineal de datos en la que los nuevos elementos se introducen
por un extremo y los ya existentes se eliminan por el otro. Es importante sealar que los
componentes de la cola se eliminan en el mismo orden en el cual se insertaron. Es decir, el primer
elemento que se introduce en la estructura ser el que se eliminara en primer orden. Debido a esta
caracterstica, las colas tambin reciben el nombre de estructuras FIFO (First-In, First-Out: el
primero en entrar es el primero en salir).

Implementacin
Las colas, al igual que las pilas, no existen como estructuras de datos estndar en lenguajes de
programacin. Este tipo de estructura de datos se puede representar mediante el uso de:
-Arreglos
-Listas

Pila:
Una pila (stack en ingls) es una lista ordenada o estructura de datos en la que el modo de acceso
a sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir)
que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el
rea de informtica debido a su simplicidad y ordenacin implcita de la propia estructura.
Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar (push), que coloca un
objeto en la pila, y su operacin inversa, retirar (o desapilar, pop), que retira el ltimo elemento
apilado.
En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo objeto
apilado (denominado TOS, Top of Stack en ingls). La operacin retirar permite la obtencin de
este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con
anterioridad), que pasa a ser el nuevo TOS.

Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un plato sobre una
pila de platos, y una operacin retirara retirarlo.
Las pilas suelen emplearse en los siguientes contextos:

Evaluacin de expresiones en notacin postfija (notacin polaca inversa).

Reconocedores sintcticos de lenguajes independientes del contexto

Implementacin de recursividad.

ESTRUCTURAS NO LINEALES:
Arboles:
En ciencias de la informtica, un rbol es una estructura de datos ampliamente usada que imita la
forma de un rbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se
construye el rbol y puede tener cero o ms nodos hijos conectados a l. Se dice que un nodo
es padre de un nodo si existe un enlace desde hasta (en ese caso, tambin decimos
que es hijo de ). Slo puede haber un nico nodo sin padres, que llamaremos raz. Un nodo
que no tiene hijos se conoce como hoja. Los dems nodos (tienen padre y uno o varios hijos) se
les conoce como rama.
Formalmente, podemos definir un rbol de la siguiente forma:
Caso base: un rbol con slo un nodo (es a la vez raz del rbol y hoja). Un nuevo rbol a partir de
un nodo

rboles

con

de races
elementos cada uno, puede construirse estableciendo una relacin

padre-hijo entre

y cada una de las races de los

de
nodos
unin de los

rboles. El rbol resultante

nodos tiene como raz el nodo


son los hijos de

y el conjunto de nodos hoja est formado por la

conjuntos hojas iniciales. A cada uno de los rboles

ahora subrboles de la raz.

, los

se les denota

METODOS DE RECORRIDO DE ARBOLES:


Una sucesin de nodos del rbol, de forma que entre cada dos nodos consecutivos de la sucesin
haya una relacin de parentesco, decimos que es un rbol recorrido. Existen dos recorridos tpicos
para listar los nodos de un rbol: en profundidad y en anchura. En el primer caso, se listan los
nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al nodo
anterior probando por el siguiente hijo y as sucesivamente. En el segundo, por su parte, antes de
listar los nodos de nivel
todos los de nivel

(a distancia

. Otros recorridos tpicos del rbol son preorden, postorden e inorden:

El recorrido en preorden, tambin llamado orden previo consiste en recorrer en primer lugar
la raz y luego cada uno de los hijos

aristas de la raz), se deben haber listado

en orden previo.

El recorrido en inorden, tambin llamado orden simtrico (aunque este nombre slo cobra
significado en los rboles binarios) consiste en recorrer en primer lugar
luego cada uno de los hijos

, luego la raz y

en orden simtrico.

El recorrido en postorden, tambin llamado orden posterior consiste en recorrer en primer


lugar cada uno de los hijos

en orden posterior y por ltimo la raz.

https://www.youtube.com/watch?v=wBjBKc66q_0
METODOS DE ORDENAMIENTO Y BUSQUEDA:
ALGORITMO DE BURBUJA:
Tambin conocido como ordenamiento de burbuja, es un algoritmo que se aplica para poder
ordenar una cantidad de datos ya sea de forma ascendente o descendente.
Es el algoritmo ms fcil de implementar, pero a cambio pagamos un alto precio en procesamiento,
ya que este mtodo evala una cantidad los datos muchas veces y en ocasiones innecesariamente
(como por ejemplo cuando son iguales).
A estas alturas posiblemente ya tengas conocimiento de sencillos pasos para ordenar datos, como
por ejemplo, Determinar cul es el mayor o menor de dos nmeros, pues aplicando este mtodo
podremos ordenar array, estructuras y cualquier tipo de dato NO atmico (es decir que se pueda
dividir)
Este mtodo necesita de lo siguiente para implementarse:

Un array o estructura que ordenar (>1 elemento).

Dos variables contadoras de ciclos (i,j por ejemplo).

Una variable temporal (para almacenar un dato momentneamente).

Dos ciclos y un Condicional.

EJEMPLO:

....
//DE MENOR A MAYOR (Ascendente)
#define Nelementos 4
....
int i,j;
//Variables contadoras del ciclo.
int lista[Nelementos]={6,9,3,1}; //Declaracion e inicializacin de un arreglo de 4 elementos.
int temp=0;
//Variable temporal.
for (i=1;i<Nelementos;i++)
{
for (j=0; j <= Nelementos-1 ;j++)
{
if (lista[j] > lista[j+1])//Condicion mayor-menor
{
temp=lista[j];
lista[j]=lista[j+1];
lista[j+1]=temp;
}
}
}
//Para cambiar el modo de ordenamiento solo debemos cambiar la condicion < >

'''<big>Explicando un poco lo que dice el cdigo tenemos:</big>'''


# Iniciamos i a 1, de esta forma correremos el ciclo solamente 3 veces. As evitamos correr
ciclos innecesariamente.
# El segundo for, se ejecutara 3 veces por cada primer ciclo.
# La condicion nos dice:
* Si, el valor de lista 0 es mayor al valor de lista 1, es decir
* '''Si, 6 > 9''', pero como la condicion no se cumple, pasamos del ciclo y '''J=1'''.
* Si, el valor de lista 1 es mayor al valor de lista 2, es decir
* '''Si, 9 > 3''', como es '''verdadera''' hacemos:
# Guardamos momentneamente en la variable temporal el valor de lista 1, es decir 9.
# En la posicin de lista 1, guardamos el valor de lista 2, es decir 3.

# En la posicin de lista 2, guardamos el valor de temp, es decir 9


'''Volvemos''' nuevamente '''al ciclo''', ahora '''J=2'''...
* Si, el valor de lista 2 es mayor al valor de lista 3, es decir
* Si, '''9 > 1''', (recuerda que anteriormente '''movimos''' al 9 a la posicin de 3), es
verdadera =>
# Guardamos momentneamente en la variable temporal el valor de lista 2, es decir 9.
# En la posicin de lista 2, guardamos el valor de lista 3, es decir 1.
# En la posicin de lista 3, guardamos el valor de temp, es decir 9.
De esta forma el ciclo se repite hasta que todos los datos se hallan movido. Como veras
hasta ahora solo hemos estado moviendo el 9. Tu lista se vera as:
* ''Original:'' 6 '''9''' 3 1
:* ''1er Mov:'' 6 3 '''9''' 1
:* ''2do Mov:'' 6 3 1 '''9'''
Si bien ya est ms ordenada que la original, an falta bastante, pero recuerda que
estbamos en el primer ciclo del primer for (i).
'''Aca te dejo como seran los demas movimientos:'''
* ''Segundo Ciclo i:''
:* 3 6 1 9
:* 3 1 6 9
* ''Tercer Ciclo i:''
:* 1 3 6 9
:* YA!
En un principio, pensaba no presentarles las variaciones que hay de este algoritmo, pero
revisando en varios libros me percate de que aunque es el mismo algoritmo y funciona de
la misma forma (con sus ventajas y desventajas), Creo que es preferible mostrrselos para
evitar confusiones y enredos innecesarios.
== Variantes ==
Buscando en varios libros e Internet me he encontrado numerosas variantes, y por motivos
pedaggicos voy a mostrarlos, ya que considero que aunque sean el mismo algoritmo, su
diferente implementacin puede llevar a confusiones.
En lo personal considero que el algoritmo planteado al principio es el que mejor se expresa
(entiende), y es el que recomiendo implementar, pero hay libros que lo implementan de
otra forma, por lo que los que se guan con l, pueden tener confusiones a la hora de
apoyarse con este libro.
==== Variante: 1 Ciclo. ====

Aunque en realidad usa dos ciclos un while y un for, el while hace la funcin de nuestro
primer for. Sin embargo la dems implementaciones son tcnicamente las mismas, solo
que en vez de usar una variable ya preparada (j en nuestro caso), este evala con la
variable i.
<source lang=c>

VARIANTE: RESTAR
Esta es una de las ms usuales que he visto en los libros, folletos y otros. Todo es igual, pero
cambian las condiciones, de esta forma se trabaja a la inversa de nuestro algoritmo.

ALGORITMO DE ORDENAMIENTO RAPIDO O QUICKSORT:


Este algoritmo est basado en la tcnica divide y vencers (consiste en dividir el problema en
pequeos subproblemas ms sencillos para luego estos ser resueltos con un clculo ms sencillo)
as crearemos arreglos ms pequeos para ordenar estos.
Los pasos que realiza este algoritmo son:

1. Selecciona un valor del arreglo como pivote es decir un numero por el cual todos los elementos
van a ser comparados.
2. se realizan dos bsquedas: una de izquierda a derecha, buscando un elemento mayor que el
pivote, y otra de derecha a izquierda, buscando un elemento menor que el pivote. Cuando se han
encontrado los dos, se intercambian, y se sigue realizando la bsqueda hasta que las dos
bsquedas se encuentran.
3. luego se organizan los subarreglos que quedaron a mano derecha e izquierda.

Ejemplo:
Tenemos un arreglo que est definido con los valores {22,40,4,10,12,35} los pasos en quicksort
para arreglarlo son los siguientes:

1. se toma como pivote el numero 22 recuerden puede ser cualquier nmero.


2. la bsqueda de izquierda a derecha encuentra el valor 40 que es mayor a pivote y la bsqueda de
derecha a izquierda encuentra el valor 35 no lo toma porque es mayor a el numero pivote
(recuerden que la bsqueda de derecha a izquierda busca los menores) entonces continua y
encuentra a 12 que es menor que el pivote y se intercambian el resultado sera {21,12,4,10,40,35}

3. si seguimos la bsqueda la primera encuentra el valor 40, y la segunda el valor 10,pero ya se han
cruzado, as que paramos. Para terminar la divisin, se coloca el pivote en su lugar el numero
encontrado por la segunda bsqueda, el 10 quedando: {10,12,4,22,40,35}
4. ahora tenemos dividido el arreglo en dos arreglos ms pequeos que son {10,12,4} y el {40,35}, y
en ellos se repetir el mismo proceso.

PSEUDOCODIGO

Principal
variables A: arreglo[1..100] entero
variables i,j,central:entero
variables primero, ultimo: entero
para i = 1 hasta 100
leer(A[i])
Fin para
primero = 1
ultimo = 100
short(A[],100)
Fin
Funcin qsort(primero, ultimo:entero)
i = primero
j = ultimo
central = A[(primero,ultimo) div 2]
repetir
mientras A[i]
j=j-1
fin mientras
si i < = j
aux = A[i]
A[j] = A[i]
A[i] = aux
i=i+1
j=j-1
fin si
hasta que i > j
si primero < j
partir(primero,j)
fin si
si i < ultimo
partir(i, ultimo)
fin si
fin funcin qsort

IMPLEMENTACION EN JAVA

public void ordenarQuicksort(int[] vector, int primero, int ultimo){


int i=primero, j=ultimo;
int pivote=vector[(primero + ultimo) / 2];
int auxiliar;
do{
while(vector[i]<pivote) i++;
while(vector[j]>pivote) j--;
if (i<=j){
auxiliar=vector[j];
vector[j]=vector[i];
vector[i]=auxiliar;
i++;
j--;
}
} while (i<=j);
if(primero<j) ordenarQuicksort(vector,primero, j);
if(ultimo>i) ordenarQuicksort(vector,i, ultimo);
}
AQUI LES DEJO UN VIDEO PARA QUE PUEDAN VER MEJOR LA FORMA DE COMPARACION
QUE USA EL QUICKSORT ESPERO QUE SEA DE SU COMPRENSION ESTA VERSION VISUAL
DE COMO FUNCIONA ESTE ORDENAMIENTO!!!
http://www.youtube.com/watch?v=gd7DT-4jjzQ

ALGORITMO DE ORDENAMIENTO SHELL SORT

ORDENAMIENTO SHELL
El Shell Sort es una generalizacin del ordenamiento por insercin , teniendo en cuenta dos
observaciones:
El ordenamiento por insercin es eficiente si la entrada est "casi ordenada".
El ordenamiento por insercin es ineficiente, en general, porque mueve los valores slo una
posicin cada vez.
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.

La sucesin propuesta por Shell:


Peor Caso = O( n^2).
Caso Medio = O(n^2 ).
Con la sucesin
: 2^k-1
Peor Caso = O( n^1.5)

Caso Medio = O( n^1.5 )


Con la sucesin :(4^k+1+3 2^k+1)

Peor Caso = O(n^1.333)


Caso Medio=O(n^1.166)
El mejor caso sera O(n logn).

Mtodo:

public static void shellSort( int a[ ])


{
for( int gap = a.length / 2; gap > 0; gap = gap == 2 ? 1 : (int) ( gap / 2.2 ) ){
for( int i = gap; i < a.length; i++ ){
int tmp = a[ i ];
int j;
for(j = i; j >= gap && tmp < a[ j - gap ] ; j -= gap ){
a[ j ] = a[ j - gap ];
}

Ejemplo:
public class ShellSort {
public static void main(String args[]){
int arrayEntrada[]={321, 123, 213, 234, 1, 4, 5, 6}; Este es el array de elementos que vamos a
ordenar
shellSort(arrayEntrada); llamada al mtodo shellSort
for (int i=0;i < arrayEntrada.length;i++){ Este bucle imprime el contenido del array
System.out.print(arrayEntrada[i]+" ");
}fin del for
}fin del main
public static void shellSort( int a[ ]){
for( int gap = a.length / 2; gap > 0; gap = gap == 2 ? 1 : (int) ( gap / 2.2 ) ){
for( int i = gap; i < a.length; i++ ){
int tmp = a[ i ];

int j;
for(j = i; j >= gap && tmp < a[ j - gap ] ; j -= gap ){
a[ j ] = a[ j - gap ];
}
a[ j ] = tmp;
}
}
}
}class ShellSort

ALGORITMO DE ORDENAMIENTO RADIX


El ordenamiento Radix (radix sort en ingls) es un algoritmo de ordenamiento que ordena enteros
procesando sus dgitos de forma individual. Como los enteros pueden representar cadenas de
caracteres (por ejemplo, nombres o fechas) y, especialmente, nmeros en punto flotante
especialmente formateados, radix sort no est limitado slo a los enteros.
La mayor parte de los ordenadores digitales representan internamente todos sus datos como
representaciones electrnicas de nmeros binarios, por lo que procesar los dgitos de las
representaciones de enteros por representaciones de grupos de dgitos binarios es lo ms
conveniente. Existen dos clasificaciones de radix sort: el de dgito menos significativo (LSD) y el de
dgito ms significativo (MSD). Radix sort LSD procesa las representaciones de enteros
empezando por el dgito menos significativo y movindose hacia el dgito ms significativo. Radix
sort MSD trabaja en sentido contrario.
Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les
llamas a menudo "claves", que pueden existir por s mismas o asociadas a otros datos. Radix sort
LSD usa tpicamente el siguiente orden: claves cortas aparecen antes que las claves largas, y
claves de la misma longitud son ordenadas de forma lxica. Esto coincide con el orden normal de
las representaciones de enteros, como la secuencia "1, 2, 3, 4, 5, 6, 7, 8, 9, 10". Radix sorts MSD
usa orden lxico, que es ideal para la ordenacin de cadenas de caracteres, como las palabras o
representaciones de enteros de longitud fija. Una secuencia como "b, c, d, e, f, g, h, i, j, ba" ser
ordenada lxicamente como "b, ba, c, d, e, f, g, h, i, j". Si se usa orden lxico para ordenar
representaciones de enteros de longitud variable, entonces la ordenacin de las representaciones
de los nmeros del 1 al 10 ser "1, 10, 2, 3, 4, 5, 6, 7, 8, 9", como si las claves ms cortas
estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco, para
hacerlas tan largas como la clave ms larga, para el propsito de este ordenamiento.
Ejemplo.
Vector original:
V: 25

57

48

37

12

92

86

33

Asignamos los elementos en colas basadas en el dgito menos significativo de cada uno de ellos.
0:
1:
2: 12, 92

3: 33
4:
5: 25
6: 86
7: 57, 37
8: 48
9:
Despus de la primera pasada, la ordenacin queda:
V: 12 92 33 25 86 57 37 48
Colas basadas en el dgito ms significativo.
0:
1: 12
2: 25
3: 33, 37
4: 48
5: 57
6:
7:
8: 86
9: 92
Lista ordenada:
V: 12, 25, 33, 37, 48, 57, 86, 92

BUSQUEDA SECUENCIAL:
a bsqueda es el proceso de localizar un registro (elemento) con un valor de llave particular. La
bsqueda termina exitosamente cuando se localiza el registro que contenga la llave buscada, o
termina sin xito, cuando se determina que no aparece ningn registro con esa llave. Bsqueda
secuencial, tambin se le conoce como bsqueda lineal. Supongamos una coleccin de registros
organizados como una lista lineal. El algoritmo bsico de bsqueda secuencial consiste en
empezar al inicio de la lista e ir a travs de cada registro hasta encontrar la llave indicada (k), o
hasta al final de la lista.

La situacin ptima es que el registro buscado sea el primero en ser examinado. El peor caso es
cuando las llaves de todos los n registros son comparados con k (lo que se busca). El caso
promedio es n/2 comparaciones. Este mtodo de bsqueda es muy lento, pero si los datos no
estn en orden es el nico mtodo que puede emplearse para hacer las bsquedas. Si los valores
de la llave no son nicos, para encontrar todos los registros con una llave particular, se requiere
buscar en toda la lista.
Mejoras en la eficiencia de la bsqueda secuencial
1)Muestreo de acceso
Este mtodo consiste en observar que tan frecuentemente se solicita cada registro y ordenarlos de

acuerdo a las probabilidades de acceso detectadas. 2)Movimiento hacia el frente


Este esquema consiste en que la lista de registros se reorganicen dinmicamente. Con este
mtodo, cada vez que bsqueda de una llave sea exitosa, el registro correspondiente se mueve a
la primera posicin de la lista y se recorren una posicin hacia abajo los que estaban antes que l.
3)Transposicin
Este es otro esquema de reorganizacin dinmica que consiste en que, cada vez que se lleve a
cabo una bsqueda exitosa, el registro correspondiente se intercambia con el anterior. Con este
procedimiento, entre ms accesos tenga el registro, ms rpidamente avanzara hacia la primera
posicin. Comparado con el mtodo de movimiento al frente, el mtodo requiere ms tiempo de
actividad para reorganizar al conjunto de registros . Una ventaja de mtodo de transposicin es
que no permite que el requerimiento aislado de un registro, cambie de posicin todo el conjunto de
registros. De hecho, un registro debe ganar poco a poco su derecho a alcanzar el inicio de la lista.
4)Ordenamiento
Una forma de reducir el nmero de comparaciones esperadas cuando hay una significativa
frecuencia de bsqueda sin xito es la de ordenar los registros en base al valor de la llave. Esta
tcnica es til cuando la lista es una lista de excepciones, tales como una lista de decisiones, en
cuyo caso la mayora de las bsquedas no tendrn xito. Con este mtodo una bsqueda sin xito
termina cuando se encuentra el primer valor de la llave mayor que el buscado, en lugar de la final
de la lista.
EJEMPLO DE BSQUEDA SECUENCIAL
El siguiente programa cumple con los siguientes requerimientos:

Crea un men de opciones (INSERTAR, CONSULTAR, ELIMINAR Y FINALIZAR).


INSERTAR: almacena el nombre de personas en vectores estticos tipo String de tamao 50.
CONSULTAR: Utilizando el algoritmo de bsqueda secuencial pide el nombre y si lo encuentra
imprime un mensaje de encontrado, en caso contrario un mensaje de no localizado.
ELIMINAR: Utilizando el algoritmo de bsqueda secuencial pide el nombre y si lo encuentra
imprime un mensaje de encontrado y elimina el nombre ajustando el vector para no dejar espacios
en blanco, en caso contrario un mensaje de no localizado.
FINALIZAR: Imprime los nombres almacenado y sale del programa.

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class BusquedaSecuencial {
static BufferedReader br = null;static String N= "";static int n=0;static String[] Nombre
= new String[50];static String[] APaterno = newString[50];static String[] AMaterno = new String[50];
public static void main (String args[]){br
= new BufferedReader(new InputStreamReader(System.in));
do{menu();}while(Integer.parseInt(N)!=4);}
public static void menu(){do{System.out.println("Selecciona una de las opciones del men: \n "+ "1-

INSERTAR \n "+ "2- CONSULTAR "+ "\n 3- ELIMINAR \n "+ "4- FINALIZAR");try{N =
br.readLine();}catch(Exception e){e.printStackTrace();}}while(!esEntero(N) || conversor(N)<=0 ||
conversor(N)>=5 );
switch(Integer.parseInt(N)){case 1:insertar();break;case 2:consultar();break;case 3:eliminar();break;
case 4:imprimir();break;}}
public static void consultar(){if(n>0){String nombre="";int eureka=0;
try{System.out.println("Ingresa el Nombre : ");nombre = br.readLine();}catch(Exception
e){e.printStackTrace();}
for(int i=0; i<n;
i++){if(Nombre[i].equals(nombre)){eureka=1;}}if(eureka==1){System.out.println("Nombre
encontrado!!!!!. ");}else{System.out.println("Nombre NO localizado!!!!!.
");}}else{System.out.println("No hay elementos en la lista. ");}
}
public static boolean esEntero(String cad) {for(int i = 0; i<cad.length(); i++)if(
!Character.isDigit(cad.charAt(i)) )return false;
return true;}
public static int conversor(String x){int valor=0;
try{valor= Integer.parseInt(x);}catch(NumberFormatException e){System.out.println("Valor
invalido");}
return valor;}
public static void insertar(){
if(n<50){System.out.println("Leyendo datos de la persona: " + (n+1));
try{System.out.println("Ingresa el Apellido Paterno: ");APaterno[n] = br.readLine();}catch(Exception
e){e.printStackTrace();}
try{System.out.println("Ingresa el Apellido Materno: ");AMaterno[n] = br.readLine();}catch(Exception
e){e.printStackTrace();}
try{System.out.println("Ingresa el nombre: ");Nombre[n] = br.readLine();}catch(Exception
e){e.printStackTrace();}
n++;}else{System.out.println("El vector est lleno, elimina personas para poder insertar");}
}

public static void eliminar(){String nombre="";int encontrados=0;


if(n>0){
try{System.out.println("Ingresa el Nombre : ");nombre = br.readLine();}catch(Exception
e){e.printStackTrace();}
for(int i=0; i<n; i++){if(Nombre[i].equals(nombre)){encontrados++;for(int j=i; j<n;
j++){Nombre[j]=Nombre[j+1];APaterno[j]=APaterno[j+1];AMaterno[j]=AMaterno[j+1];}i--;n-;}}if(encontrados>0){System.out.println("Nombre encontrado, procediendo a eliminar!!!!!.
");}else{System.out.println("Nombre NO localizado!!!!!. ");}}else{System.out.println("No hay
elementos a eliminar.");}
}
public static void imprimir(){if(n>0){System.out.println("Apellido paterno Apellido Materno
Nombre");for(int i=0; i<n; i++){System.out.print(i+1+ ".- " + APaterno[i]
+ "\t");System.out.print(AMaterno [i] + "\t");System.out.print(Nombre [i] + ".");System.out.println();}}}
}

FUENTES:
http://es.wikipedia.org/wiki/Tipo_de_dato_abstracto
http://aprendecomputofacil.blogspot.mx/2010/06/estructura-datos-memoria-dinamica.html
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Algoritmos_y_Estructuras_de_Dato
s
http://estructuras-de-datos.wikispaces.com/ordenamiento+shell+sort
http://estructuras-de-datos.wikispaces.com/Ordenamiento+rapido+o+quickSort
http://es.wikipedia.org/wiki/Ordenamiento_Radix
http://www.programacionfacil.com/estructura_datos_csharp/definicion_recusividad
http://es.wikipedia.org/wiki/Problema_del_barbero_durmiente
http://es.wikipedia.org/wiki/Problema_de_la_cena_de_los_fil%C3%B3sofos
http://pilasycolas-estructuraslineales.blogspot.mx/
http://es.wikipedia.org/wiki/Lista_%28inform%C3%A1tica%29#Aplicaciones_de_las_listas_e
nlazadas
http://es.wikipedia.org/wiki/Pila_(inform%C3%A1tica)
https://estructuradedatositp.wikispaces.com/6.1.+M%C3%A9todo+de+b%C3%BAsqueda+SE
CUENCIAL

Vous aimerez peut-être aussi