利用多執行緒實現歸併排序。歸併排序是分治演算法的代表,適合改寫為多執行緒。
資料規模為2∗1
062*10^6
2∗10
6,整數。arr
ay_l
engt
h=2∗
106array\_length = 2*10^6
array_
leng
th=2
∗106
srand((
int)
time
(null))
;for
(int i =
0; i < array_length;
++i)
利用
s/ti
me.h
>
s/ti
me.h
>
內部提供的get
numo
fday
()getnumofday()
getnum
ofda
y()函式,可以精確到微妙級別,但我最後輸出是毫秒級別,所以需要轉換單位。**如下:
struct timeval tbegin, tend;
gettimeofday
(&tbegin,
null);
int arg[2]
; arg[0]
=0; arg[1]
= array_length;
pthread_t tid;
numofthread =1;
pthread_create
(&tid,
null
, merge_sort, arg)
;pthread_join
(tid,
null);
gettimeofday
(&tend,
null);
if(flag ==1)
我需要控制好執行緒的使用個數,因此要統計當前正在執行的執行緒個數。為了避免潛在的bug,我並沒有用到多少指標的東西,基本都是全域性陣列全域性變數。歸併排序其實有兩個函式,mer
ge_s
ortmerge\_sort
merge_
sort
函式是遞迴實現分治的基礎。我在該函式的單執行緒版本上進行了些許改動。
**如下:
void
merge_sort
(void
* arg)
pthread_t t2;
pthread_t t1;
if(numofthread == maxthreadnumber)
if(numofthread < maxthreadnumber)
else
if(numofthread < maxthreadnumber)
else
merge
(left, right)
;}
#include
#include
#include
#include
#include
#include
#define debug 0
#define array_length 2000000
int a[array_length+5]
;int numofthread =0;
int maxthreadnumber =21;
int flag =0;
void
merge
(int left,
int right)
else
k++;}
while
(i < size1)
while
(j < size2)
}void
merge_sort
(void
* arg)
pthread_t t2;
pthread_t t1;
if(numofthread == maxthreadnumber)
if(numofthread < maxthreadnumber)
else
if(numofthread < maxthreadnumber)
else
merge
(left, right);}
void
createdata()
}int
main()
printf
("the running time is %d millisecond\n"
,(tend.tv_usec - tbegin.tv_usec)
/1000);
#if debug == 1
for(
int i =
0; i < array_length;
++i)
#endif
return0;
}
下面比較各種執行緒數量,我的程式的執行效果。
從這4個不同的執行緒數量可以對比看出,執行緒數越多,程式執行時間是越短的。單執行緒執行效率最低,多執行緒每次執行緒數翻倍,執行時間大大縮短。而且並不是只縮短一半,縮短幅度大大提高。
歸併排序並不難,改寫為多執行緒版本花費了不少時間在除錯**上。說明我對多執行緒的掌握還不算到位。但是通過這次練習,我有了更深刻的了解。
C語言實現歸併排序
歸併排序 時間複雜度 o nlogn 空間複雜度 o n 穩定性 穩定 實現原理 採用分治法 divide and conquer 將已有序的子串行合併,得到完全有序的序列,即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,也叫二路歸併。實現 採用遞迴方法實現 include...
歸併排序 C語言實現
merging sort 就是將兩個或兩個以上的有序表合併成一 個有序表的過程。將兩個有序表合併成個有序表的過程稱為2 路歸併,2 路歸併最為簡單和常用。演算法思想 假設初始序列含有n個記錄,則可看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行 再...
C語言實現歸併排序
歸併排序演算法完全遵循分治模式 偽 對分組歸併 merge a,p,q,r n1 q p 1 n2 r q let l 1.n1 1 and r 1.n2 1 be new arrays for i 1 to n1 l i a p i 1 for j 1 to n2 r j a q j l n1 1...