美文网首页
双线程冒泡排序算法

双线程冒泡排序算法

作者: 我明白了我是一条鲶鱼 | 来源:发表于2021-12-25 17:31 被阅读0次

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

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

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

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

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

    //
    //  main.c
    //  Two-threadedBubbleSort
    //
    //  Created by 孙树港 on 2021/12/25.
    //
    
    #include <stdio.h>
    #include <pthread/pthread.h>
    
    //冒泡排序从左边开始排序
    //最右边都是最大的
    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;
    }
    
    

    相关文章

      网友评论

          本文标题:双线程冒泡排序算法

          本文链接:https://www.haomeiwen.com/subject/engdqrtx.html