多线程实现归并排序
有点简单直接上代码,呜呜呜
//
// merge_sort.c
// merge_sort
// 多线程方法
// Created by Yibin on 2021/4/8.
// Copyright © 2021 Yibin. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
int *array_master;
FILE* freader;
int file_length, array_length;
int read_length(char* fname);
int *read_file(char* fname);
void merge(int arr[],int left,int middle,int right);
void* merge_sort(void* arg);
int main(int argc,char **argv){
char *fname = argv[1];
file_length = read_length(fname);
array_master = read_file(fname);
int arg[2];
arg[0] = 0;
arg[1] = file_length - 1;
pthread_t tid;
pthread_create(&tid,NULL,merge_sort,arg);
pthread_join(tid,NULL);
int j;
for(j = 0;j < array_length; j++){
if(j == array_length - 1)
printf("%d\n",array_master[j]);
else
printf("%d, ",array_master[j]);
}
return 0;
}
int read_length(char* fname){
freader = fopen(fname,"rt");/* only_read open*/
char line[80];
int file_length = 0; // out_function var need extern
while(fgets(line,80,freader) != NULL)
++file_length;
/* get length*/
fclose(freader);
return file_length;
}
int *read_file(char* fname){
freader = fopen(fname,"rt"); /* read_only open */
int bufsize = file_length;
char line[80];
int integer; // char turn into integer using sscanf()
int index = 0;
int *input = (int *)malloc(bufsize*sizeof(int));
while(fgets(line,80,freader)!=NULL){
sscanf(line,"%d",&integer);
input[index] = integer;
++index;
++array_length;
}
fclose(freader);
return input;
}
void merge(int arr[],int left,int middle,int right){
int i,j,k; // local variable
int half1 = middle - left + 1;
int half2 = right - middle;
int first[half1];
int second[half2];
for(i = 0;i < half1; i++)
first[i] = arr[left + i];
for(j = 0;j < half2;j++)
second[j] = arr[middle+1+j];
i = j = 0;
k = left;
while(i<half1 && j<half2){
if(first[i] <= second[j]){
arr[k] = first[i];
i++;
}else {
arr[k] = second[j];
j++;
}
k++;
}
while(i < half1){
arr[k] = first[i];
++i;
++k;
}
while(j < half2){
arr[k] = second[j];
++j;
++k;
}
}
void* merge_sort(void* arg){
int* arr = array_master;
int* argu = (int*)arg;
int l = argu[0];
int r = argu[1];
if(l<r) {
pthread_t tid_1;
pthread_t tid_2;
int arg1[2];
int arg2[2];
int middle;
middle = (l+r-1)/2;
arg1[0] = l;
arg1[1] = middle;
arg2[0] = middle+1;
arg2[1] = r;
pthread_create(&tid_1,NULL,merge_sort,arg1);
pthread_create(&tid_2,NULL,merge_sort,arg2);
pthread_join(tid_1,NULL);
pthread_join(tid_2,NULL);
merge(arr,l,middle,r);
pthread_exit(0);
}
return NULL;
}
wow!!! 真棒水了一篇文章