双线程冒泡排序算法是对冒泡排序的优化,对冒泡排序加入了另外一个线程。
冒泡排序可以从数组的第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;
}
网友评论