1. 程式人生 > >對多個有序數組,實現歸並操作

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

進行 tro tor cli 解決 ID 最小值 方便 方法

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

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

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