《多核程序設計》學習筆記:冒泡排序的並行實現

咱們都知道冒泡排序的串行算法的實現,很是簡單,兩個for循環便可實現,那麼並行算法又如何實現呢?算法

先介紹一下算法思想。windows

(1)串行算法思想:從左至右依次比較相鄰的兩個數據,若是左邊的數比右邊的數大,則交換,這樣通過一輪變換後,最大的數據就會移到最右邊;而後第二輪只需比較剩餘的n-1個數便可,找到次最大的數據;依次類推,直到將這n個數據排好序。數組

下面是串行冒泡排序算法的核心代碼:函數

for(i=0;i<n-1;i++)	//n-1輪
	{
		for(j=0;j<n-i-1;j++)
		{
			if(array[j]>array[j+1])
			{
				tmp=array[j];
				array[j]=array[j+1];
				array[j+1]=tmp;
			}
		}
	}

(2)並行算法思想:並行算法能夠使用奇偶排序是冒泡排序的並行化版本,其思想就是將冒泡排序的每輪操做分解成奇數位和偶數位上的比較、交換,且互不干擾,因此能夠並行化。線程

//#include"stdafx.h"
#include<stdio.h>
#include<malloc.h>
#include<windows.h>
int* array;
bool flag=false;
void Exchange(int* j)		//比較並交換相鄰元素
{
	int b;
	int k=*((int* )j);
	if(array[k]>array[k+1])
	{
		b=array[k];
		array[k]=array[k+1];
		array[k+1]=b;
		flag=true;
	}
}
void Parallel_BubbleSort(int length)       //並行冒泡排序主體
{
	int i,j;
	int *tag=(int* )malloc(sizeof(int)*length);
	for(i=0;i<length;i++)
		tag[i]=i;
	HANDLE* h=(HANDLE* )malloc(sizeof(HANDLE)*(length/2));
	for(i=0;i<length;i++)
	{
		if(i%2==0)		//比較偶數位
		{
			
			for(j=0;j<length-1;j+=2)	//每循環一次,就建立一個交換線程
			{
                //建立線程函數
				h[j/2]=CreateThread(NULL,		
								0,
								(LPTHREAD_START_ROUTINE)Exchange,
								&tag[j],		//不能直接傳j,j值會改變
								0,
								NULL);			
				printf("建立偶數線程\n");
			}
			WaitForMultipleObjects((length-1)/2,h,TRUE,INFINITE);
		}
		else	//比較奇數位
		{
			for(j=1;j<length-1;j+=2)
			{
				h[(j-1)/2]=CreateThread(NULL,
									0,
									(LPTHREAD_START_ROUTINE)Exchange,
									&tag[j],
									0,
									NULL);
				printf("建立奇數線程\n");
			}
			WaitForMultipleObjects(length/2,h,TRUE,INFINITE);
			if(!flag)		//當一次偶一次奇以後,才能跳出
				break;
			flag=false;
		}
	}
}
void main()
{
	int i,length;
	printf("請輸入數組長度:");
	scanf("%d",&length);
	if(length<0)
		printf("輸入錯誤!");
	else
	{
		array=(int* )malloc(sizeof(int)*length);		//建立動態數組
		printf("請輸入數組的值:");
		for(i=0;i<length;i++)
		{
			scanf("%d",&array[i]);
		}
		Parallel_BubbleSort(length);
		for(i=0;i<length;i++)
			printf("%d ",array[i]);
		printf("\n");
	}
}

上述代碼,爲了提升算法效率,增長了一個標誌位flag,當最後數組數據已經排好序,就跳出循環,而非循環最大的次數。code

 

在兩個算法先後加上clock()計時函數,比較運行時間發現:並行的奇偶排序算法所花費的時間比串行算法還要多,由於它建立線程很是頻繁,所消耗的時間相對來講比較大。排序

相關文章
相關標籤/搜索