feat: Initial commit
This commit is contained in:
85
Lab06/sort.c
Normal file
85
Lab06/sort.c
Normal file
@@ -0,0 +1,85 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <string.h>
|
||||
#define BUF_SIZE 2048
|
||||
|
||||
int **matrix;
|
||||
int lines[100];
|
||||
char filenames[2][10] = {"foo", "bar"};
|
||||
|
||||
int cmpfunc (const void * a, const void * b) {
|
||||
return ( *(int*)a - *(int*)b );
|
||||
}
|
||||
|
||||
int count_lines(FILE* file)
|
||||
{
|
||||
char buf[BUF_SIZE];
|
||||
int counter = 0;
|
||||
for(;;)
|
||||
{
|
||||
size_t res = fread(buf, 1, BUF_SIZE, file);
|
||||
if (ferror(file))
|
||||
return -1;
|
||||
|
||||
int i;
|
||||
for(i = 0; i < res; i++)
|
||||
if (buf[i] == '\n')
|
||||
counter++;
|
||||
|
||||
if (feof(file))
|
||||
break;
|
||||
}
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
|
||||
void *sort(void * vargs) {
|
||||
int num = (int) vargs;
|
||||
|
||||
FILE * fin = fopen(filenames[num], "r");
|
||||
lines[num] = count_lines(fin);
|
||||
fseek(fin,0L,SEEK_SET);
|
||||
matrix[num] = malloc(lines[num]*sizeof(int));
|
||||
for (int i = 0; i < lines[num]; i++) fscanf(fin, "%d", &matrix[num][i]);
|
||||
fclose(fin);
|
||||
|
||||
qsort(matrix[num], lines[num], sizeof(int), cmpfunc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
pthread_t tids[2];
|
||||
int tmp[1000], res[1000], cur_len;
|
||||
matrix = malloc(2*sizeof(int *));
|
||||
|
||||
pthread_create(&tids[0], NULL, sort, (void *)0);
|
||||
pthread_create(&tids[1], NULL, sort, (void *)1);
|
||||
|
||||
for (int i = 0; i<2; i++) {
|
||||
pthread_join(tids[i], NULL);
|
||||
|
||||
if (i == 0) {
|
||||
memcpy(res, matrix[i], sizeof(int)*lines[i]);
|
||||
cur_len = lines[i];
|
||||
continue;
|
||||
}
|
||||
|
||||
int a = 0, b = 0, j = 0;
|
||||
while (a<cur_len && b<lines[i]) {
|
||||
tmp[j++] = (res[a] > matrix[i][b]) ? matrix[i][b++] : res[a++];
|
||||
}
|
||||
while (a<cur_len) tmp[j++] = res[a++];
|
||||
while (b<lines[i]) tmp[j++] = matrix[i][b++];
|
||||
cur_len += lines[i];
|
||||
memcpy(res, tmp, sizeof(int)*cur_len);
|
||||
}
|
||||
|
||||
for (int i = 0; i<cur_len;i++) {
|
||||
printf("%d ",res[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user