双线程冒泡排序算法

双线程冒泡排序算法是对冒泡排序的优化,对冒泡排序加入了另外一个线程。

冒泡排序可以从数组的第0个元素开始排列,同样也可以从最后一个元素开始排列。 无论是从左往右排列还是从右往左排列,排列出来的效果是一样的。

我的优化方法就是,一个线程从左往右执行冒泡排序算法,另外一个线程从右往左执行冒泡排序算法。两个线程分别执行到数组的中间位置,之后停止排列。最后把排列好的右边一半的数组和左边一半的数组,拼接起来就得到一个完整地排列好的数组。

虽然项目中很少由程序员去编写冒泡排序算法。然而我觉得并行排序算法一定会有它的优势。对冒泡排序使用双线程排序后,排序的时间会接近原来的二分之一。

同样的方法适用于二分查找和其他排序算法。 待更新。我已经写好了代码并且放到了gitee上面:https://gitee.com/sunshugang/two-threaded-bubble-sort

//
//  main.c
//  Two-threadedBubbleSort
//
//  Created by 孙树港 on 2021/12/25.
//

#include 
#include 

//冒泡排序从左边开始排序
//最右边都是最大的
void *sort(int *a)
{
    int len = 10;
    int i=0;
    int j;
    int t;
    for(i = 0; i < len - 1; i ++)
    {
        for(j = 0; j < len - 1  - i; j ++)
        {
            if(a[j] > a[j+1])
            {
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
        
        if (i == 4) {
            break;;
        }
    }
    
    printf("b: ");
    for(int i = 0;i < 10;i ++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    
    return (void *)0;
}


//冒泡排序从右边开始排
//最右边是最大的
void* sortFromTheEnd(int* a)
{
    int len = 10;
    int tmp = 0;
    for (int i = len - 1; i >= 0; i --)
    {
        for (int j = len - 1; j >= len - i; j --)
        {
            if (a[j] < a[j - 1])
            {
                tmp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = tmp;
            }
        }
        
        if (i == 5) {
            break;;
        }
    }
    
    printf("a: ");
    for(int i = 0;i < 10;i ++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    
    return (void *)0;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    int a[10]={
        2, 3, 77, 12, -88, 0, -8, 99, 100, -999
    };
    int b[10]={
        2, 3, 77, 12, -88, 0, -8, 99, 100, -999
    };
    
    //add thread
    pthread_t tidp, tidp1;
    int ret, ret1;
    ret = pthread_create(&tidp, NULL, sortFromTheEnd, a);
    ret1 = pthread_create(&tidp1, NULL, sort, b);
    
    if (ret) {
        printf("pthread_create failed:%d\n", ret);
        return  -1;
    }
    if (ret1) {
        printf("pthread1_create failed:%d\n", ret1);
        return  -1;
    }
    
    pthread_join(tidp1, NULL);
    pthread_join(tidp, NULL);
    
    int c[10];
    for (int i = 0; i < 10; i ++) {
        if (i <= 5) {
            c[i] = a[i];
        } else {
            c[i] = b[i];
        }
    }
    
    printf("c: ");
    for(int i = 0;i < 10;i ++)
    {
        printf("%d ",c[i]);
    }
    printf("\n");
    
    printf("Hello, World!\n");
    return 0;
}

你可能感兴趣的:(双线程冒泡排序算法)