微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

段故障调用指针数组上的mergesort

如何解决段故障调用指针数组上的mergesort

我正在尝试使用C中的线程。我需要我的一个线程来处理整个数组的一半,并对其一半进行归并排序。为此,我为整个数组和两个一半创建了一个全局数组指针。在运行时使用malloc分配。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

void *process1(void *arg);
void *process2(void *arg);
void *process3(void *arg);
void *process4(void *arg);
void *process5(void *arg);

void merge(int *arr,int l,int m,int r);
void mergeSort(int *arr,int r);

int *array;
int *arr_first;
int *arr_second;
int arr_s;
size_t n_size;
int n_size_i;
pthread_mutex_t mutex;

main(int argc,char *argv[]) {

    arr_s = atoi(argv[1]);

    n_size = arr_s / 2;
    n_size_i = arr_s / 2;
    
    array = malloc (arr_s * sizeof (int));  
    
    arr_first = malloc(arr_s / 2 * sizeof(int));

    if (arr_s % 2 == 0)
        arr_second = malloc((n_size) * sizeof (int));
    else
        arr_second = malloc((n_size+1) * sizeof(int));
    
    pthread_t tid1,tid2,tid3,tid4,tid5;
    pthread_attr_t attr;

    pthread_attr_init(&attr);
    pthread_mutex_init(&mutex,NULL);

    pthread_create(&tid1,&attr,process1,NULL);
    pthread_join(tid1,NULL);

    printf("---------------------------------------------------------------------------THREAD 2 AND 3 ARE CURRENTLY SORTING THE NUMBERS-------------------------------------------------------------------------\n");

    pthread_create(&tid2,process2,NULL);
    pthread_create(&tid3,process3,NULL);
    
    pthread_join(tid2,NULL);
    pthread_join(tid3,NULL);

    pthread_create(&tid4,process4,NULL);   
    pthread_join(tid4,NULL);

    pthread_create(&tid5,process5,NULL);
    pthread_join(tid5,NULL);

    free(array);
    free(arr_first);
    free(arr_second);
    exit(0);    
}

这是我的线程在(线程2)上遇到问题时函数的外观,目前,它所做的全部工作占用了整个数组的前半部分,而一个一个获取了值并将其放入其数组中拥有。然后我打印出数组。然后,最后在数组指针上调用mergesort

void *process2(void *arg) {
    int j = 0;
    for (; j < (arr_s / 2); j++) {
        arr_first[j] = array[j];
    }

    int j2;
    for (j2 = 0; j2 < (arr_s / 2); j2++) {
        printf("*%d\t",arr_first[j2]);
        if ((j2 + 1) % 25 == 0 && j2 > 0)
            printf("\n");
    }   
    
    mergeSort(arr_first,(arr_s / 2) - 1);
        
    pthread_exit (0);
}

这是我的merge和mergeSort函数

//Merges two subarrays of arr[]
//First subarry is arr[l..m]
//Second subarry is arr[m+1..r]
void merge(int *arr,int r) {
    int i,j,k;
    int n1 = m - l + 1;
    int n2 = r - m;

    //create temp arrays
    int L[n1],R[n2];

    //copy data to temp array L[] and R[]
    for (i = 0; i < n1; i++)
        L[i] = arr[l+i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];

    //merge the temp arrays back in arr[l..r]
    i = 0; j = 0; k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    //copy remaining elements of L[],if there are any
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
    
    //same for R[]
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

void mergeSort(int *arr,int r) {
    if (l < r) {
        int m = 1 + (r - 1) / 2;

        //Sort first and second halves
        mergeSort(arr,l,m);
        mergeSort(arr,m + 1,r);

        merge(arr,m,r);
    }
}

由于某种原因,当我调用合并排序时,它将继续递归调用多次,甚至比数组中的所有元素都多。我在mergeSort函数中的其他任何内容之前都放置了一条打印语句,该打印语句执行的次数可能超过50000次。但是,如果我在mergeSort内的merge调用之前放置一条print语句,它将永远不会执行。

解决方法

mergeSort中中间点的计算不正确:l1之间存在混淆。应该是:

    int m = l + (r - l) / 2;

为变量l命名很容易非常。使用leftlow代替:

void mergeSort(int *arr,int left,int right) {
    if (left < right) {
        int m = left + (right - left) / 2;

        //Sort first and second halves
        mergeSort(arr,left,m);
        mergeSort(arr,m + 1,right);

        merge(arr,m,right);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。