雙線程冒泡排序算法是對(duì)冒泡排序的優(yōu)化债沮,對(duì)冒泡排序加入了另外一個(gè)線程洽瞬。
冒泡排序可以從數(shù)組的第0個(gè)元素開始排列儡循,同樣也可以從最后一個(gè)元素開始排列隔披。 無論是從左往右排列還是從右往左排列篮洁,排列出來的效果是一樣的裳扯。
我的優(yōu)化方法就是,一個(gè)線程從左往右執(zhí)行冒泡排序算法芥炭,另外一個(gè)線程從右往左執(zhí)行冒泡排序算法享怀。兩個(gè)線程分別執(zhí)行到數(shù)組的中間位置羽峰,之后停止排列趟咆。最后把排列好的右邊一半的數(shù)組和左邊一半的數(shù)組添瓷,拼接起來就得到一個(gè)完整地排列好的數(shù)組。
雖然項(xiàng)目中很少由程序員去編寫冒泡排序算法值纱。然而我覺得并行排序算法一定會(huì)有它的優(yōu)勢(shì)鳞贷。對(duì)冒泡排序使用雙線程排序后,排序的時(shí)間會(huì)接近原來的二分之一虐唠。
同樣的方法適用于二分查找和其他排序算法搀愧。 待更新。我已經(jīng)寫好了代碼并且放到了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;
}