这是代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
void display(int *arr, int size) {
int i;
for(i=0; i<size; i++)
printf("%d ", arr[i]);
printf("\n");
}
void display2(int *arr, int size) {
int i;
for(i=1; i<size; i++)
printf("%d ", arr[i]);
printf("\n");
}
void mergeA(int* arr, int lb, int ub, int mid) {
// printf("Inside mergeA\n");
int i=lb, j=mid+1, k=lb;
int newarr[1000];
while(i<=mid && j<=ub) {
if(arr[i] > arr[j])
newarr[k++] = arr[j++];
else
newarr[k++] = arr[i++];
}
for(; i<=mid; i++)
newarr[k++] = arr[i];
for(; j<=ub; j++)
newarr[k++] = arr[j];
for(i=lb; i<=ub; i++)
arr[i] = newarr[i];
}
void mergeD(int* arr, int lb, int ub, int mid) {
// printf("Inside mergeD\n");
int i=lb, j=mid+1, k=lb;
int newarr[1000];
while(i<=mid && j<=ub) {
if(arr[i] < arr[j])
newarr[k++] = arr[j++];
else
newarr[k++] = arr[i++];
}
for(; i<=mid; i++)
newarr[k++] = arr[i];
for(; j<=ub; j++)
newarr[k++] = arr[j];
for(i=lb; i<=ub; i++)
arr[i] = newarr[i];
}
void mergeSortA(int* arr, int lb, int ub) {
// printf("Inside mergeSortA\n");
if(lb<ub) {
int mid = (lb+ub)/2;
mergeSortA(arr, lb, mid);
mergeSortA(arr, mid+1, ub);
mergeA(arr, lb, ub, mid);
}
}
void mergeSortD(int* arr, int lb, int ub) {
// printf("Inside mergeSortD\n");
if(lb<ub) {
int mid = (lb+ub)/2;
mergeSortD(arr, lb, mid);
mergeSortD(arr, mid+1, ub);
mergeD(arr, lb, ub, mid);
}
}
void* sort_a(void* args) {
int* arr = (int*)malloc(sizeof(int)*1000);
arr = (int*)args;
int size = arr[0];
printf("Inside Sort A: ");
display2(arr, size);
mergeSortA(arr, 1, size-1);
printf("After Sort A: ");
display2(arr, size);
pthread_exit((void*)arr);
}
void* sort_d(void* args) {
int* arr = (int*)malloc(sizeof(int)*1000);
arr = (int*)args;
int size = arr[0];
printf("Inside Sort D: ");
display2(arr, size);
mergeSortD(arr, 1, size-1);
printf("After Sort D: ");
display2(arr, size);
pthread_exit((void*)arr);
}
int main() {
pthread_t t1, t2;
int arr[1000];
int i=0, j, k1=1, k2=1;
//Taking the array as input
while(1) {
printf("Enter an element or 'quit' to stop input: ");
char input[100];
scanf("%s", input);
if(strcmp(input, "quit") == 0)
break;
arr[i++] = atoi(input);
}
printf("The Array:\n");
display(arr, i);
//Spliting the array into two
int arr1[1000], arr2[1000];
for(j=0; j<i; j++) {
if(j<i/2)
arr1[k1++]=arr[j];
else
arr2[k2++]=arr[j];
}
//Storing size in index 0
arr1[0] = k1;
arr2[0] = k2;
//Creating the threads
pthread_create(&t1, NULL, &sort_a, (void*)arr1);
pthread_create(&t2, NULL, &sort_d, (void*)arr2);
//Joining the threads
pthread_join(t1, (void*)arr1);
pthread_join(t2, (void*)arr2);
//After Sorting
printf("Main Thread:\n");
display2(arr1, k1);
display2(arr2, k2);
}
我希望输出与函数(sort_a 和 sort_d)中的输出相同,但第一个索引中的元素始终是垃圾值。 注意:本例中的第一个索引是 1,因为我已将长度存储在第 0 个索引中
如您所见,主线程中的输出不正确。
在 MergeD 中,比较应该是:
if(arr[i] > arr[j]) /* not if(arr[i] < arr[j]) */
sort_a 和 sort_d malloc 数组,但永远不要释放它们。他们应该释放分配的内存。两个合并函数都应该使用 malloc,而不是使用大小为 1000 的本地数组,以便可以对更大的数组进行排序。
两个线程完成后,需要进行最后的合并。
两个线程不需要有一组单独的函数。
作为使用索引 0 作为数组大小的替代方法,pthread_create 可以将指向结构的指针作为参数传递,其中该结构将包含指向数组中元素的指针和大小。