多路归并是外部排序(External Sort)的基础,实现也比较简单,和最简单的归并排序中的二路归并是基本一样的,只不过路数是浮动的k。
(1)假设有K路数据流,流内部是有序的,且流间同为升序或降序
(2)首先读取每个流的第一个数,如果已经EOF,pass
(3)将有效的k(k可能小于K)个数比较,选出最小的那路mink,输出,读取mink的下一个
(4)直到所有K路都EOF
代码如下:
/* * main.c * * Created on: 2011-11-11 * Author: liheyuan */ #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef int TYPE; #define MIN_MAX 8888 void k_merge(TYPE** arrs, int* lens, int k) { int* cnts = (int*) malloc(sizeof(int) * k); int* has_next = (int*) malloc(sizeof(int) * k); TYPE* datas = (int*) malloc(sizeof(int) * k); int i; int min_index = 0; TYPE min; //Read each k-way first into data for (i = 0; i < k; i++) { if (lens[i] >= 1) { datas[i] = arrs[i][0]; cnts[i] = 1; has_next[i] = 1; } else { has_next[i] = 0; } } while (1) { //Select min in k min = MIN_MAX; min_index = 0; for (i = 0; i < k; i++) { if (has_next[i]) { if (datas[i] < min) { min = datas[i]; min_index = i; } } } if (min == MIN_MAX) { //No way has data break; } else { //print printf("%d\n", datas[min_index]); //Succ get one min if (cnts[min_index] < lens[min_index]) { datas[min_index] = arrs[min_index][cnts[min_index]]; cnts[min_index]++; } else { has_next[min_index] = 0; } } } free(cnts); } //void k_merge(TYPE** arrs, int* lens, int k) int main() { TYPE a[5] = { 1, 3, 5, 7, 17 }; TYPE b[3] = { -1, 10, 20 }; TYPE c[4] = { -20, 30, 88, 111 }; TYPE* arrs[3] = { a, b, c }; int lens[3] = { 5, 3, 4 }; k_merge(arrs, lens, 3); return 0; }
输出:
-20 -1 1 3 5 7 10 17 20 30 88 111