c - 线程只会对数组的第一个分区进行排序(冒泡排序,Pthread)

标签 c sorting unix pthreads

我正在尝试使用 10 个线程对长度为 1000 的数组进行排序。第一个线程是 0 到 99,第二个是 100 到 199 ....我的问题是只有前 100 个元素被排序,其余的元素保持不变,即使线程在排序以外的所有方面都按预期运行。

#define N 1000
int arr[N];
int main(int argc, char *argv[])
{

    int i;

    //Filling the array with random integers
    for(i=0;i<N;i++)
    {
        arr[i]=1+rand()%200;
    }

    for(i=0;i<N;i++)
    {
        printf("%d | ",arr[i]);
    }
    printf("\n");

    /*      START OF THREAD SECTION    */

    pthread_t sorters[10];

    for(i=0;i<10;i++)
    {
        pthread_create(&sorters[i],NULL,sortArr,(void*)i);
        pthread_join(sorters[i],NULL);
    }

    /*      END OF THREAD SECTION     */


    return 0;
}

主题:

void* sortArr(void *num)
{
    int i,j,temp,cast,first=0,last;

    //Casting
    cast=(intptr_t)num;

    //Calculating first and last element
    first=(cast*100);   
    last=first+99;

    printf("first %d , last %d \n",first,last);

    printf("Not sorted:\n");
    for(i=first;i<last;i++)
    {
        printf("%d | ",arr[i]);
    }   
    printf("\n");

    /*    SORTING */
    for (i = first; i < last-1; i++)
    {  
        for (j = first; j < last-i; j++)
        {
            if (arr[j] > arr[j+1])
            {
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    /*    SORTING */

    printf("Sorted:\n");
    for(i=first;i<last;i++)
    {
        printf("%d | ",arr[i]);
    }   
    printf("\n");
}

以我目前的知识,我只能尝试很多事情来弄清楚,任何帮助将不胜感激。

最佳答案

如果 first 不为 0,则内部循环退出条件使其立即退出。应该是

for (j = first; j < last + first - i; j++)

另外,这 10 个线程毫无意义,因为它们不是并行运行的。您应该将连接移动到单独的循环中。

关于c - 线程只会对数组的第一个分区进行排序(冒泡排序,Pthread),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906422/

相关文章:

c++ - memcpy() 函数是可重入的吗?

c - 在循环中使用 scanf() 扫描 CSV 文件在第一行和第二行开始后停止

Java,如果数组包含重复值,则返回 true

perl - 在 Perl 中对文件名进行排序?

c - 关于在偏移量 : what is GCC complaining about? 处访问字节的 GCC 警告

c - "The C Programming Book"中的函数 getop() 是如何工作的?

javascript - 使用 Javascript 对下拉列表进行排序

c - 在 c 程序中使用 'rm' 命令使用 stdlib.h 中的 system() 函数

unix - 如何在 unix 中查找忽略大小写的文件名

linux - Linux 中的 vm.overcommit_ratio 是什么?