程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 兩種外排序的思路sorting by merging&sorting by distribution

兩種外排序的思路sorting by merging&sorting by distribution

編輯:關於C語言

今天我思考了一個問題,順便翻了翻,對外排序進行了些思考,分享如下:

假定在磁盤上有16個數字,而內存只能容下4個數進行排序,那麼歸並的排序和桶排序有怎樣的區別呢?其實各有千秋。歸並的排序無疑是最常用的,思想簡單,但最後一步多路歸發揮多核優勢有困難,桶排序的方法充分發揮多核優勢,難點在於如何讓桶內distributing進來的關鍵字數量一致,詳細可參考我曾推薦的這本書。

為了便於理解我舉了個例子:


input:1  4  2  8  12  11  3  6  9  40  28  27   21  7  6  3

output:

 

sorting by merge

(1)分段                 (2)內排序        (3)多路歸並(敗者樹)

1   4   2   8             1  2   4   8

12  11  3   6           3  6   11  12  

9   40  28  27         9  27  28  40     1 2 3 3 4 6 6 7 8 9 11 12 21 27 28 40

21  7   6   3            3  6    7   21

(1)其實是什麼也不做

磁盤IO量0次

input:1  4  2  8  12  11  3  6  9  40  28  27   21  7  6  3

output:

(2)

磁盤IO量16*2=32字節(讀16字節,寫16字節)

input:1  2  4  8  3  6  11  12  9  27  28  40   3  6  7  21

output:

(3)

磁盤IO量讀16*2 = 32字節

input:     1  2  4  8  3  6  11  12  9  27  28  40   3  6  7  21

output:1  2  3  3  4  6  6  7  8  9  11  12  21  27  28  40

 

如果有4個CPU,第一、二個階段4個CPU可以同時參與計算,第三階段最多可有2個CPU可參與計算,一個從output開頭寫,一個從output結尾寫,兩頭往中間寫,直到滿。文件可以采用內存映射的方式,實現兩頭往中間寫。

 

 

sorting by distribution

(1)分桶                 (2)內排序(排序後,則按桶的順序自然有序)        

1   2   3   3             1   2    3    3

4   6   7   6             4   6    6    7

8   9   12  11          8   9    11  12   

40  28  27  21        21  27  28  40

 

(1)

磁盤IO量16*2 = 32字節

input:     1  4  2  8  12  11  3  6  9  40  28  27   21  7  6  3

output:1  2  3  3  4  6  7  6  8  9  12  11  40  28  27  21

(2)

磁盤IO量16*2 = 32字節

input:     1  4  2  8  12  11  3  6  9  40  28  27   21  7  6  3

output:1  2  3  3  4  6  6  7  8  9  11  12  21  27  28  40

 

如果有4個CPU,第一、二個階段4個CPU可以同時參與計算。但難點是如何讓每個桶的數均勻。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved