lunes, 16 de abril de 2012

Semana 10

El aporte de esta semana son unos programas en c del mergesort

#include<stdio.h>
void obtenernum(int arr[],int n){
int i;
printf("Dame los numeros: ");
for(i=0;i<n;i++){
scanf("%d",&arr[i]);
}
}
void mostrar(int arr[],int n){
int i;
printf("");
for(i=0;i<n;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
void ordenar(int arr[],int bajo,int mid,int alto){
int i,j,k,l,b[20];
l=bajo;
i=bajo;
j=mid+1;
while((l<=mid)&&(j<=alto)){
if(arr[l]<=arr[j]){
b[i]=arr[l];
l++;
}
else{
b[i]=arr[j];
j++;
}
i++;
}
if(l>mid){
for(k=j;k<=alto;k++){
b[i]=arr[k];
i++;
}
}
else{
for(k=l;k<=mid;k++){
b[i]=arr[k];
i++;
}
}
for(k=bajo;k<=alto;k++){
arr[k]=b[k];
}
}
void divarr(int arr[],int bajo,int alto){
int mid;
if(bajo<alto){
mid=(bajo+alto)/2;
divarr(arr,bajo,mid);
divarr(arr,mid+1,alto);
ordenar(arr,bajo,mid,alto);
}
}
void main(){
int arr[20];
int n;
printf("Dame la cantidad de numeros a ordenar:");
scanf("%d",&n);
obtenernum(arr,n);
divarr(arr,0,n-1);
mostrar(arr,n);
}
view raw Mergesort.c hosted with ❤ by GitHub



y aqui el merge sort con threads no estoy seguro si esta hecho de una buena forma

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define NOTHREADS 2
/*
gcc -lpthread Merget.c al compilar para que los threads funcionen y no den error
*/
int a[] = {10, 8, 5, 2, 3, 6, 7, 1, 4, 9};
typedef struct node {
int i;
int j;
}
NODE;
void mezcla(int i, int j){
int mid = (i+j)/2;
int ai = i;
int bi = mid+1;
int newa[j-i+1], newai = 0;
while(ai <= mid && bi <= j) {
if (a[ai] > a[bi])
newa[newai++] = a[bi++];
else
newa[newai++] = a[ai++];
}
while(ai <= mid) {
newa[newai++] = a[ai++];
}
while(bi <= j) {
newa[newai++] = a[bi++];
}
for (ai = 0; ai < (j-i+1) ; ai++)
a[i+ai] = newa[ai];
}
void * ordenamiento(void *a){
NODE *p = (NODE *)a;
NODE n1, n2;
int mid = (p->i+p->j)/2;
pthread_t thr1, thr2;
int ret;
n1.i = p->i;
n1.j = mid;
n2.i = mid+1;
n2.j = p->j;
if (p->i >= p->j) return;
ret = pthread_create(&thr1, NULL, ordenamiento, &n1);
if (ret) {
printf("%d %s - No se pudo crear el thread - ret - %d\n", __LINE__, __FUNCTION__, ret);
exit(1);
}
ret = pthread_create(&thr2, NULL, ordenamiento, &n2);
if (ret) {
printf("%d %s - No se pudo crear el thread - ret - %d\n", __LINE__, __FUNCTION__, ret);
exit(1);
}
pthread_join(thr1, NULL);
pthread_join(thr2, NULL);
mezcla(p->i, p->j);
pthread_exit(NULL);
}
int main(){
int i;
NODE m;
m.i = 0;
m.j = 9;
pthread_t thr;
int ret;
ret=pthread_create(&thr, NULL, ordenamiento, &m);
if (ret) {
printf("%d %s - No se pudo crear el thread- ret - %d\n", __LINE__, __FUNCTION__, ret);
exit(1);
}
pthread_join(thr, NULL);
for (i = 0; i < 10; i++)
printf ("%d ", a[i]);
printf ("\n");
return 0;
}
view raw Merget.c hosted with ❤ by GitHub

Mis nominaciones son para:
Jose Gonzales, Alejandro Avendaño y Eduardo Triana

No hay comentarios:

Publicar un comentario