This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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); | |
} |
y aqui el merge sort con threads no estoy seguro si esta hecho de una buena forma
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
Mis nominaciones son para:
Jose Gonzales, Alejandro Avendaño y Eduardo Triana
No hay comentarios:
Publicar un comentario