對多個有序數組,實現歸並操作


工作中遇到了多個有序鏈的歸並操作,這里記錄一下解決方法。方便后續使用。

歸並的方法列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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM