对多个有序数组,实现归并操作

工作中遇到了多个有序链的归并操作,这里记录一下解决方法。方便后续使用。

归并的方法列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;
}

 

posted on 2018-04-27 08:34  旭东的博客  阅读(3024)  评论(0编辑  收藏  举报

导航