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

双线程冒泡排序算法

作者: 我明白了我是一条鲶鱼 | 来源:发表于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;
}

相关文章

  • 双线程冒泡排序算法

    双线程冒泡排序算法是对冒泡排序的优化,对冒泡排序加入了另外一个线程。 冒泡排序可以从数组的第0个元素开始排列,同样...

  • 算法-冒泡排序

    算 法:冒泡排序算法时间复杂度: 冒泡排序算法概述 冒泡排序伪代码 冒泡排序实现 冒泡排序算法概述 冒泡排...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • iOS算法总结-冒泡排序

    iOS算法总结-冒泡排序 iOS算法总结-冒泡排序

  • python 冒泡排序和选择排序算法

    插入排序算法 冒泡排序算法

  • Java基础(冒泡排序与选择排序)

    冒泡排序 冒泡排序算法运行起来非常慢,但在概念上它是排序算法中最简单的,因此冒泡排序算法在刚开始研究排序技术时是一...

  • 基本算法——快速排序算法

    快速排序算法是对冒泡算法的改进。所以我们首先来简单的谈谈冒泡算法。 1.冒泡算法 冒泡排序(Bubble S...

  • 7.4-全栈Java笔记:三种经典算法

    冒泡排序算法 冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是基本的素养。 算法重复地...

网友评论

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

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