[高性能并行系統]-多線程實現Sample-Sort(C語言版本)

本文主要介紹如何使用多線程的方式實現Sample-sort(據說是Google搜索使用的排序算法),使用的是C語言,但是其中用到了部分的C++ 標準輸入輸出庫,接下來從下面幾個步驟來進行展示:

1)sample-sort的主要思想;

2)sample-sort的多線程實現步驟詳解;

3)sample-sort程序的測試;


一、sample-sort的主要思想

sample-sort其實是一種變種的桶排序[bucket sort]算法,如果你對桶排序不是清楚,可以查看此鏈接的博文進行了解:桶排序

input : array ?to be sorted(length = n)

output: ?sorted array

1. ?確定sample-sort中bucket的個數 k;

2. “smartly”選擇出k-1 個splitters(將整個數組分成k個bucket的分類器)

2.1 將被排序的數據均分為k個block,每個block中有(n/k)個元素,并且給每一個block進行排序;

2.2 從每個block中選出k-1 個相距間隔一樣的元素,作為備選的splitter;

? ?2.3 對這個k*(k-1)個元素進行排序,然后在這些元素當中選擇(k-1)個相距間隔一樣;

的元素;

3. 使用第二個步驟中確定的(k-1)個splitters進行桶排序

具體實例可以看下圖1 :

圖 1 ?sample sort 實例詳細過程


二、sample-sort的多線程實現步驟詳解


步驟詳解圖:

圖 2 ?步驟詳解圖


1)step1: 讀取用戶的數據 k(thread的個數,也就是bucket的個數),filename(保存原始數據的文本文件);其代碼如下圖3所示:

圖 3 ?讀取用戶的參數代碼


2)step2: 將file中的數據全部讀取到 array_raw中,然后新建一個長度和array_raw長度一樣的數組array_sorted;函數功能實現如下圖4:

圖 4 ?從文件中讀取數據


3)step3: 根據上面描述的“智能”選擇splitters的算法,將array_raw中的k-1 個splitter給找出來,其功能函數實現如下圖:

圖 5 ?找到相應的splitters

對于數據為DATA1.txt 并且 k=5 的情況下,找出的splitter如下圖所示:

圖 6 ?對應k=5時的splitters


4)Step 4: 確定每個bucket中處理數據的值的范圍,確定bucket中處理好的數據放回array_sorted中的上下界

4.1確定每個bucket中處理的數據的值的范圍,例如,根據上面的splitter 280648543,知道bucket1中處理的數據的值的范圍為 (-inf,280648543]

4.2.確定每個bucket中處理好的數據放回到array_sorted的上下界,以免后面thread回寫數據時發生沖突;例如第一個bucket-1處理的數據時100個,那么bucket-1中處理完數據之后回寫到array_sorted的[0, 100]的位置當中,緊接著如果bucket-2中需要處理的數據時200個,那么其回寫到array_sorted的上下界為[100,300]

其實現代碼如下圖7:

圖 7 ?查找bucket處理的值的范圍和邊界范圍

對于數據為DATA1.txt 并且 k=5 的情況下,輸出的每個bucket中處理的值的范圍 和 處理好的數據放回到array_sorted數組中的上下界的結果如下圖8,由該結果,我們可以知道:第一個bucket處理的數據的值的范圍從(-1,280648543],然后放回到array_sorted中的上下界為[0, 2804 );

圖 8 ? 查找bucket處理的值的范圍和邊界范圍實例


5)Step 5將step4中得到的結果以參數的方式,傳送給代表該bucket的thread中,該參數中包括的具體參數如下圖9所示:

圖 9 ?傳給thread的參數結構體的內容

然后這一步驟5 主要完成的工作如下:

5.1.?準備好傳送給k個thread的paras,新建k個threa運行,并且等待k個thread運行完成。代碼如下圖10 所示;

圖 10 ?創建thread 并且等待其執行完

5.2.?thread中執行的函數的主要操作是,將array_raw(原始數組)中符合其值范圍的數據挑選出來,然后將這些數據進行排序,然后寫回到array_sorted數組當中,其代碼如下圖11;

圖 11 ?thread 執行函數代碼

5.3.?所有thread執行完之后,將排好序的數據寫入到DATA_SORTED1.txt和文件中,其代碼如下圖12;

圖 12 ?寫結果到文本文件中

DATA_SORTED1.txt的結果如下圖13所示,這個時候咱們已經得到了最終的結果:

圖 13 ?DATA1 排序之后的結果


三、sample-sort程序的測試


為了測試這個程序的正確性,對測試數據DATA1.txt,分別設置 k 為2,4,8,10進行測試,對于上面的情況,最后輸出的文件當中排序都沒有問題,和圖12中內容是一樣的,下面主要是將k=2,4,6,8,10 輸出的計算過程中的結果展示出來;

1. k= 2 時,其輸出的結果如下圖14所示:

圖 14 ?k=2 時的輸出


2. k= 4 時,其輸出的結果如下圖15所示:

圖 15 ?k=4 時的輸出


3. k= 8 時,其輸出的結果如下圖16所示:

圖 16 ?k=8 時的輸出


4. k= 10 時,其輸出的結果如下圖17所示:

圖 17 ?k=10 時的輸出


聲明:

1. 聯系作者,你可以私信新浪微博:@谷谷_z

2.如果在文章當中發現有描述錯誤的地方,還請您不吝指出,萬分感謝!

3.此文章系本人原創作品,轉發請注明出處!


源文件資源:

鏈接: https://pan.baidu.com/s/1eSHWjZ0 密碼: y56s

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容