咱們都知道冒泡排序的串行算法的實現,很是簡單,兩個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()計時函數,比較運行時間發現:並行的奇偶排序算法所花費的時間比串行算法還要多,由於它建立線程很是頻繁,所消耗的時間相對來講比較大。排序