NACIONAL
ESCUELA SUPERIOR DE CMPUTO
ANLISIS Y DISEO DE
ALGORITMOS PARALELOS
PRCTICA 7
PROFRA: SANDRA LUZ MORALES BUITRN
Introduccin
El algoritmo trabaja de la siguiente forma:
Elegir un elemento de la lista de elementos a
ordenar, al que llamaremos pivote.
Resituar los dems elementos de la lista a cada
lado del pivote, de manera que a un lado queden
todos los menores que l, y al otro los mayores.
Los elementos iguales al pivote pueden ser
colocados tanto a su derecha como a su
izquierda, dependiendo de la implementacin
deseada. En este momento, el pivote ocupa
exactamente el lugar que le corresponder en la
lista ordenada.
La lista queda separada en dos sublistas, una
formada por los elementos a la izquierda del
pivote, y otra por los elementos a su derecha.
Repetir este proceso de forma recursiva para
cada sublista mientras stas contengan ms de un
elemento. Una vez terminado este proceso todos
los elementos estarn ordenados.
Como se puede suponer, la eficiencia del algoritmo
depende de la posicin en la que termine el pivote
elegido.
En el mejor caso, el pivote termina en el centro
de la lista, dividindola en dos sublistas de
igual tamao. En este caso, el orden de
complejidad del algoritmo es O(nlog n). Silvi
esto esta entero bueno.
En el peor caso, el pivote termina en un extremo
de la lista. El orden de complejidad del
algoritmo es entonces de O(n). El peor caso
depender de la implementacin del algoritmo,
aunque habitualmente ocurre en listas que se
encuentran ordenadas, o casi ordenadas. Pero
principalmente depende del pivote, si por
Cdigo Secuencial
quick.cpp
// Funcin para dividir el array y hacer los intercambios
int divide(int *array, int start, int end) {
int left;
int right;
int pivot;
int temp;
pivot = array[start];
left = start;
right = end;
Programa
qs_se.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "quick.cpp"
int main()
{
int const MAX = 100;
int arraySize;
clock_t start_time;
clock_t final_time;
double total_time;
start_time = clock();
int a[arraySize];
final_time = clock();
total_time = ((double)(final_time - start_time)) /
CLOCKS_PER_SEC;
return 0;
}
Cdigo Paralelo
#include <iostream.h>
#include <sys/time.h>
#include <mpi.h>
using namespace std;
int i;
for (i=0; i<length/size; i++)
data[i] = rand();
MPI_Status status;
// Send all of the data to processor 0
if (rank == 0) {
for (i=1; i<size; i++)
length;
int pivot;
for (s=size; s > 1; s /= 2) {
if (rank % s == 0) {
pivot = partition(data, 0, localDataSize);
MPI_Finalize();
}