对多个有序数组,实现归并操作
工作中遇到了多个有序链的归并操作,这里记录一下解决方法。方便后续使用。
归并的方法列2种:
(1) 堆排序, 或者胜利树。减少比较次数。效率高,实现比较麻烦。
(2) 普通方法,每次都需要比较。实现简单,一般用这个就可以。
下面的代码是,普通的方法,支持多个有序数组的归并操作。
#include <stdio.h> #include <climits> #include <vector> struct NodeList{ int *val; //保存数据的值数组 int num; //数据的个数 int curr; //当前统计到的下标 NodeList(int n):num(n), curr(0){ val = new int[n]; } ~NodeList(){ if (val){ delete [] val; val = NULL; } } }; void print_sort(std::vector<NodeList*> ver){ int len = 0; int min_val = 0; int min_idx = -1; //多个有序数组进行归并操作 while((len = ver.size()) > 0){ min_val = INT_MAX; min_idx = -1; //选取当前轮次的最小值 for(int i = 0; i < len; ++i){ if (ver[i]->curr >= ver[i]->num){ ver.erase(ver.begin() + i); break; } int tmp_val = ver[i]->val[ver[i]->curr]; if (tmp_val <= min_val){ min_val = tmp_val; min_idx = i; } } //打印 if (min_idx != -1){ printf("%d\n", min_val); ++(ver[min_idx]->curr); } } } int main(){ //新建有序数组 NodeList a(2); a.val[0] = 3; a.val[1] = 4; NodeList b(3); b.val[0] = 1; b.val[1] = 3; b.val[2] = 5; NodeList c(2); c.val[0] = 4; c.val[1] = 6; //构建有序数组列表 std::vector<NodeList*> ver; ver.push_back(&a); ver.push_back(&b); ver.push_back(&c); //排序打印 print_sort(ver); return 0; }