java线程归并排序_linux下利用pthread做多线程归并排序

#include

#include

#include

typedef struct ThreadData {

int start, end;//待排序的范围

int* array;//数组指针

int length;//数组的长度

}ThreadData;

//函数原型声明

void p_mergeSort(ThreadData* data);

void merge(int array[], int length, int left, int m, int right);

void mergeSort(int array[], int length, int start, int end);

//方便pthread_create调用,和mergesort之间做一个接口

void p_mergeSort(ThreadData* data)

{

mergeSort(data->array, data->length, data->start, data->end);

}

// 归并排序中的合并算法

void merge(int array[], int length, int left, int m, int right)

{

int* temp = (int*)malloc(sizeof(int) * length);

int i, j, k;

i = left;

j = m + 1;

k = 0;

for (; i <= m && j <= right;) {

if (array[i] < array[j]) {

temp[k++] = array[i++];

}

else {

temp[k++] = array[j++];

}

}

while (i <= m) {

temp[k++] = array[i++];

}

while (j <= m) {

temp[k++] = array[j++];

}

k = 0;

for (i = left; i <= right; i++) {

array[i] = temp[k++];

}

free(temp);

}

// 归并排序

void mergeSort(int array[], int length, int start, int end)

{

if (start < end) {

int i;

pthread_t tid1, tid2;

ThreadData data_left, data_right;

i = (end + start) / 2;

data_left.array = array;

data_left.length = length;

data_left.start = start;

data_left.end = i;

data_right.array = array;

data_right.length = length;

data_right.start = i+1;

data_right.end = end;

// 启动2个线程分别对左右两部分进行mergeSort

pthread_create(&tid1, NULL, (void*)p_mergeSort, (void*)& data_left);

pthread_create(&tid2, NULL, (void*)p_mergeSort, (void*)& data_right);

pthread_join(tid1, NULL);

pthread_join(tid2, NULL);

// join等待完成后,再merge

merge(array, length, start, i, end);

}

}

int main() {

pthread_t tid;

int ret;

int array[] = {9,8,7,6,5,4,3,2,1,0};

ThreadData data;

data.array = array;

data.start = 0;

data.end = 9;

data.length = 10;

ret = pthread_create(&tid, NULL, (void*)p_mergeSort, (void*)&data);

if (ret) {

printf("Thread Create Error\n");

exit(0);

}

pthread_join(tid, NULL);

for (int i = 0; i < 10; i++) {

printf("%d ", array[i]);

}

printf("\n");

printf("Main Ends\n");

return 0;

}

编译命令:

gcc sort.c -o a -lpthread

运行结果:

90e987387151ec1a7f49a9201bb022d2.png

1b162abddd1264af4bab6182809aaa91.png

068be7e19a8fd7ea1cc73db7ddbb42c1.png

李先生i

发布了10 篇原创文章 · 获赞 9 · 访问量 5653

私信

关注

标签:mergeSort,int,void,linux,length,pthread,array,多线程,data

来源: https://blog.csdn.net/qq_38084725/article/details/104091570

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值