分类: IT业界
2012-07-30 11:42:13
多路归并是外部排序(External Sort)的基础,实现也比较简单,和最简单的归并排序中的二路归并是基本一样的,只不过路数是浮动的k。
(1)假设有K路数据流,流内部是有序的,且流间同为升序或降序
(2)首先读取每个流的第一个数,如果已经EOF,pass
(3)将有效的k(k可能小于K)个数比较,选出最小的那路mink,输出,读取mink的下一个
(4)直到所有K路都EOF
代码如下:
001 | /* |
002 | * main.c |
003 | * |
004 | * Created on: 2011-11-11 |
005 | * Author: liheyuan |
006 | */ |
007 |
008 | #include |
009 | #include |
010 | #include |
011 |
012 | typedef int TYPE; |
013 |
014 | #define MIN_MAX 8888 |
015 |
016 | void k_merge(TYPE** arrs, int* lens, int k) |
017 | { |
018 | int* cnts = (int*) malloc(sizeof(int) * k); |
019 | int* has_next = (int*) malloc(sizeof(int) * k); |
020 | TYPE* datas = (int*) malloc(sizeof(int) * k); |
021 | int i; |
022 | int min_index = 0; |
023 | TYPE min; |
024 |
025 | //Read each k-way first into data |
026 | for (i = 0; i < k; i++) |
027 | { |
028 | if (lens[i] >= 1) |
029 | { |
030 | datas[i] = arrs[i][0]; |
031 | cnts[i] = 1; |
032 | has_next[i] = 1; |
033 | } |
034 | else |
035 | { |
036 | has_next[i] = 0; |
037 | } |
038 | } |
039 |
040 | while (1) |
041 | { |
042 |
043 | //Select min in k |
044 | min = MIN_MAX; |
045 | min_index = 0; |
046 | for (i = 0; i < k; i++) |
047 | { |
048 | if (has_next[i]) |
049 | { |
050 | if (datas[i] < min) |
051 | { |
052 | min = datas[i]; |
053 | min_index = i; |
054 | } |
055 | } |
056 | } |
057 |
058 | if (min == MIN_MAX) |
059 | { |
060 | //No way has data |
061 | break; |
062 | } |
063 | else |
064 | { |
065 |
066 | printf("%d\n", datas[min_index]); |
067 |
068 | //Succ get one min |
069 | if (cnts[min_index] < lens[min_index]) |
070 | { |
071 | datas[min_index] = arrs[min_index][cnts[min_index]]; |
072 | cnts[min_index]++; |
073 | } |
074 | else |
075 | { |
076 | has_next[min_index] = 0; |
077 | } |
078 | } |
079 | } |
080 |
081 | free(cnts); |
082 | } |
083 |
084 | //void k_merge(TYPE** arrs, int* lens, int k) |
085 |
086 | int main() |
087 | { |
088 | TYPE a[5] = |
089 | { 1, 3, 5, 7, 17 }; |
090 | TYPE b[3] = |
091 | { -1, 10, 20 }; |
092 | TYPE c[4] = |
093 | { -20, 30, 88, 111 }; |
094 | TYPE* arrs[3] = |
095 | { a, b, c }; |
096 | int lens[3] = |
097 | { 5, 3, 4 }; |
098 |
099 | k_merge(arrs, lens, 3); |
100 |
101 | return 0; |
102 | } |
输出:
01 | -20 |
02 | -1 |
03 | 1 |
04 | 3 |
05 | 5 |
06 | 7 |
07 | 10 |
08 | 17 |
09 | 20 |
10 | 30 |
11 | 88 |
12 | 111 |