Вы находитесь на странице: 1из 10

Captulo 14. Algoritmos de ordenacin y de bsqueda. 1. Introduccin. 2. Mtodos de ordenacin. 2.1. Mtodo de insercin directa. 2.2.

Mtodo de seleccin directa. 2.3. Mtodo de intercambio directo o de la burbuja. 2.4. Mtodo Quicksort. 3. Mtodos de bsqueda. 3.1. Bsqueda directa. 3.2. Bsqueda directa con datos ordenados. 3.3. Bsqueda binaria o dicotmica.

1. Introduccin. Uno de los procesos ms usuales en el tratamiento de datos es la ordenacin de los mismos. Lgicamente, los datos se ordenan para acelerar su posterior localizacin. Cuando el criterio de ordenacin se basa en una variable numrica, obviamente un nmero es mayor que otro si su valor es ms grande. Cuando se trata de una variable alfanumrica, una ser mayor que otra si por orden alfabtico es posterior. Debe recordarse que el orden que se aplica es el establecido en el cdigo ASCII. Por ejemplo, el carcter d es mayor que el Z, ya que las maysculas son todas menores que las minsculas. Por otra parte, para comparar cadenas de caracteres tenemos la funcin strcmp() que fue explicada en un captulo anterior. La bsqueda de un dato dentro de un conjunto es otro de los procesos ms habituales en el tratamiento de informacin. Como vamos a ver, si los datos estn ordenados, la localizacin de uno de ellos puede acelerarse. 2. Mtodos de ordenacin. En todos los mtodos que vamos a comentar se supone que tenemos un array de N elementos y lo queremos ordenar de menor a mayor. El ndice del array se mover entre 0 y N-1. Estos mtodos podrn aplicarse a estructuras de datos diferentes de los arrays, como por ejemplo los registros de un fichero, siendo el algoritmo idntico y cambiando simplemente los nombres de algunas variables. 2.2. Mtodo de insercin directa. Consiste en buscar para cada elemento, desde el elemento 0 en adelante, el puesto que le corresponde entre los elementos ya ordenados. Cuando se va a localizar el puesto del elemento i, los elementos anteriores del 0 al i-1 ya estarn ordenados. El proceso sera: - i vale 0: cuando slo se considera un elemento (valor 19), est en su puesto.
i=0 1 2 3 4

19

13

- i pasa a 1: consideramos dos elementos; se busca el puesto del elemento i, es decir del elemento 1 (valor 5); si el puesto es el 0, se desplaza el elemento 0 (valor 19) una posicin, insertando el elemento 1 en la posicin 0.
0 i=1 2 3 4

19 13

- i pasa a 2: consideramos 3 elementos; se busca el puesto del elemento i, es decir del elemento 2 (valor 13); el puesto se busca desde la posicin 0 hasta la i-1, o sea desde 0 a 1; al 13 le corresponde el puesto 1, por lo que se desplaza

desde esa posicin hasta i los elementos del array (slo el 19 en este ejemplo) y se inserta el 13 en la posicin 1.
0 1 i=2 3 4

13 19

- i pasa a 3: consideramos 4 elementos; se busca el puesto del elemento i, es decir del elemento 3 (valor 4); el puesto se busca desde la posicin 0 hasta la i-1, o sea desde 0 a 2; al 4 le corresponde el puesto 0, por lo que se desplaza desde esa posicin hasta i los elementos del array (el 5, el 13 y el 19 en este ejemplo) y se inserta el 4 en la posicin 0.
0 1 2 i=3 4

13 19

- i pasa a 4: consideramos 5 elementos; se busca el puesto del elemento i, es decir del elemento 4 (valor 7); el puesto se busca desde la posicin 0 hasta la i-1, o sea desde 0 a 3; al 7 le corresponde el puesto 2, por lo que se desplaza desde esa posicin hasta i los elementos del array (el 13 y el 19 en este ejemplo) y se inserta el 7 en la posicin 2.
0 1 2 3 i=4

13 19

- i pasa a 5: como i es igual a N (el nmero de elementos del array), ya finaliza el proceso. Por tanto, se trata de buscar el puesto de N elementos, es decir un bucle de N iteraciones (i de 0 a N-1). Para cada iteracin, es decir para cada elemento i, debe buscarse su puesto recorriendo el array hasta i, o sea este bucle usar una j desde 0 a i. Cuando se conozca el puesto de un elemento i, debern desplazarse todos los elementos una posicin. Los elementos a desplazar son desde el puesto encontrado hasta i. El elemento i se insertar en el hueco libre que ha quedado al desplazar los elementos. Ej. N vale 5. #define N 5 ... int A[N] = {19, 5, 13, 4, 7}; int i, j, PuestoI, ElementoInsertar; for (i = 0; i < N; i++) //Para cada elem. del array { PuestoI = 0; //En principio el puesto es 0 for (j = 0; j < i; j++) if (A[i] > A[j]) //Cada vez que el elem. es PuestoI++; //mayor, tiene un puesto ms. ElementoInsertar = A[i]; //Usa variable auxiliar.
3

for (j = i-1; j >= PuestoI; j--) //El bucle debe ir A[j+1] = A[j]; //hacia atrs (j--), para no //sobrescribir los elementos. A[PuestoI] = ElementoInsertar; //Inserta elemento. } Este algoritmo tambin funciona cuando un mismo valor aparece repetido en el array. 2.2. Mtodo de seleccin directa. Este mtodo consiste en recorrer el array completo y para cada iteracin i localizar el menor elemento. Una vez localizado, se intercambia el elemento menor con el que est en la posicin i. Por tanto, se trata simplemente de buscar el menor elemento entre los que quedan por ordenar, es decir desde i hasta N-1. Ej. N vale 5. #define N 5 ... int A[N] = {19, 5, 13, 4, 7}; int i, j, PuestoMenor, ElementoIntercambio; for (i = 0; i < N; i++) //Para cada elem. del array { PuestoMenor = i; //Inicialmente el puesto es donde //est el elem. i. for (j = i+1; j < N; j++) //Recorre los que quedan //por ordenar. if (A[j] < A[PuestoMenor]) PuestoMenor = j;

ElementoIntercambio = A[i]; A[i] = A[PuestoMenor]; A[PuestoMenor] = ElementoIntercambio; } Este mtodo no aplica el bucle de desplazamiento que el mtodo anterior aplicada para cada elemento del array. 2.3. Mtodo de intercambio directo o de la burbuja. Este mtodo consiste en recorrer el array completo. Cada elemento i intercambia con el anterior mientras el elemento i sea menor. Esto implica que para cada elemento i deber recorrerse el array desde i-1 hasta 0 o hasta que se encuentre un elemento menor que el i. De este modo cada elemento va subiendo en el array (burbuja), ya que se va intercambiando con el anterior, hasta quedar en su puesto. Cuando se va a procesar el elemento i, debe tenerse en cuenta que todos los elementos anteriores ya estarn ordenados.
4

Ej. N vale 5. #define N 5 ... int A[N] = {19, 5, 13, 4, 7}; int i, j, Aux; //Variable auxiliar para intercambiar. for (i = 0; i < N; i++) { for (j = i-1; j >= 0 && A[j] > A[j+1]; j--) { Aux = A[j]; //Se va intercambiando el elemento A[j]= A[j+1]; //con el anterior mientras estn A[j+1] = Aux; //desordenados. } } 2.4. Mtodo Quicksort. Este mtodo est considerado actualmente el mejor algoritmo de ordenacin. Como vamos a ver, se puede implementar usando recursividad. Consiste en elegir un elemento cualquiera del array, por ejemplo el que ocupa la posicin central, y en una primera pasada colocar todos los elementos mayores despus de ese elemento y todos los elementos menores antes de dicho elemento central. Se aplicar de nuevo el proceso a cada mitad del array, llamando a la misma funcin, de forma recursiva. Es decir, se ejecuta el mismo algoritmo sobre el trozo de array donde han quedado los elementos menores y por otra parte sobre el trozo de array con los elementos mayores. El algoritmo finaliza cuando el nmero de elementos del trozo de array que se va a procesar sea menor o igual a 0, es decir que el trozo de array no tenga elementos. Ej. N vale 5. #define N 5 void QuickSort(int A[], int Desde, int Hasta); void main(void) { int A[N] = {19, 5, 13, 4, 7}; int i; QuickSort(A, 0, N-1); } void QuickSort(int A[], int Desde, int Hasta) { int Izq, Der, Mitad, Aux;
5

Izq = Desde; Der = Hasta; Mitad = A[(Izq+Der) / 2]; do { for ( ;Izq <= Der && A[Izq] < Mitad; Izq++); for ( ;Der >= Izq && A[Der] > Mitad; Der--); if (Izq <= Der) { Aux = A[Izq]; A[Izq] = A[Der]; A[Der] = Aux; Izq++; Der--; } } while (Izq <= Der); if (Izq < Hasta) QuickSort(A, Izq, Hasta); if (Der > Desde) QuickSort(A, Desde, Der); } 3. Mtodos de bsqueda. Como en el caso de la ordenacin, vamos a suponer que tenemos un array de N elementos. El ndice del array se mover entre 0 y N-1. El algoritmo de bsqueda debe indicarnos si un valor determinado est en el array y en qu posicin o si por el contrario no est. Los mtodos de bsqueda que vamos a ver podrn aplicarse a estructuras de datos diferentes de los arrays. El algoritmo ser el mismo, slo cambiarn los nombres de algunas variables. Cuando los datos estn ordenados, los algoritmos de bsqueda pueden ser diferentes y ms rpidos. 3.1. Bsqueda directa. Este es el mtodo ms sencillo y consiste en ir comparando el valor buscado con los sucesivos valores del array, hasta que sean iguales (es localizado) o hasta que finalice el array (no es localizado). No es necesario que los datos del array estn ordenados. Ej. N vale 5. #define N 5 void main(void) { int A[N] = {19, 5, 13, 4, 7}; int i, ValorBuscar; scanf(%2d, &ValorBuscar); fflush(stdin); for (i = 0; i < N && ValorBuscar != A[i]; i++) { ; } //El bucle for slo incrementa la i.

if (i < N) printf(Encontrado en posicin %d, i); else printf(No encontrado); } Debe tenerse en cuenta que si se utiliza despus del bucle la condicin if (ValorBuscar == A[i])... no es del todo correcto, ya que cuando el valor buscado no se localiza, la i acaba en el valor N y pudiera dar la casualidad que el valor de A[N] coincidiera con ValorBuscar. A[N] es el valor despus del array en memoria, ya que el array llega hasta N-1. 3.2. Bsqueda directa con datos ordenados. Si los datos del array estn ordenados, por ejemplo de menor a mayor, cuando se llega a un valor del array que sea mayor que el buscado, la bsqueda finaliza, ya que los valores sucesivos del array sern an mayores, por estar ordenado el array de menor a mayor. Ej. N vale 5. #define N 5 void main(void) { int A[N] = {19, 5, 13, 4, 7}; int i, ValorBuscar; scanf(%2d, &ValorBuscar); fflush(stdin); for (i = 0; i < N && ValorBuscar > A[i]; i++); { ; } //El bucle for slo incrementa la i. if (i < N && ValorBuscar == A[i]) printf(Encontrado en posicin %d, i); else printf(No encontrado); } 3.3. Bsqueda binaria o dicotmica. Para utilizar este mtodo es necesario que los datos estn ordenados. El algoritmo consiste en comprobar si el valor es menor o mayor que el valor central del array o mayor. Si es menor indica que el valor buscado se encuentra en la primera mitad del array, aplicndose el mismo mtodo a esa mitad, descartndose la segunda mitad. Si es mayor indica que el valor buscado se encuentra en la segunda mitad del array y por tanto se aplicar el mismo mtodo a esa segunda mitad, descartndose la primera mitad. Las comparaciones con el valor central se hacen hasta que coincida con el valor buscado o hasta que la mitad del array no tenga elementos. Ej. N vale 5. #define N 5 int BusquedaBinaria(int [], int, int, int);
7

void main(void) { int A[N] = {1,6,7,22,25}; int i, ValorBucar; scanf("%d", &Valor); fflush(stdin); i = BusquedaBinaria(A, 0, N-1, ValorBuscar); if (i == -1) printf("\n No localizado"); else printf("\n Localizado en posicin %d", i); } int BusquedaBinaria(int A[], int Desde, int Hasta, int ValorBuscar) { int enc = -1; int izq = Desde, der = Hasta, cen = (der+izq) / 2; while (ValorBuscar != A[cen] && izq < der) { if (ValorBuscar > A[cen]) izq = cen + 1; else if (ValorBuscar < A[cen]) der = cen - 1; cen = (der + izq) / 2; } if (ValorBuscar == A[cen]) enc = cen; return(enc); } Esta funcin puede implementarse de forma recursiva. int BusquedaBinaria(int A[], int Desde, int Hasta, int ValorBuscar) { int enc = -1; int cen = (Hasta + Desde) / 2; if (Hasta >= Desde) { if (Valor > A[cen]) enc = Buscar(A, cen+1, Hasta, Valor); else if (Valor < A[cen]) enc = Buscar(A, Desde, cen-1, Valor); else enc = cen; } return(enc); }
8

EJERCICIOS - CAPITULO 14: Realizar los siguientes algoritmos en pseudocdigo y en C. 1. Aadir datos de artculos a un fichero binario con los campos cdigo ( long), descripcin y precio. Despus ordenarlo por cdigo utilizando el mtodo de la burbuja. 2. Ordenar el fichero del ejercicio anterior por descripcin aplicando el mtodo de seleccin directa. 3. Buscar artculos por cdigo en el fichero que est ordenado por cdigo usando el mtodo de bsqueda directa en datos ordenados. 4. Buscar artculos por descripcin aplicando la bsqueda lgicamente sobre el fichero ordenado por descripcin. binaria,

10

Вам также может понравиться