码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-04-27 12:23:06      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:遇到   push   bre   nod   有序数组   nbsp   bsp   列表   新建   

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

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

 

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

标签:遇到   push   bre   nod   有序数组   nbsp   bsp   列表   新建   

原文地址:https://www.cnblogs.com/xudong-bupt/p/8915515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!