C語言實現多執行緒的歸併排序

2021-09-16 12:47:02 字數 3073 閱讀 6061

​ 利用多執行緒實現歸併排序。歸併排序是分治演算法的代表,適合改寫為多執行緒。

​ 資料規模為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...