您的位置:首页 > 编程语言 > C语言/C++

一段合并多个有序数组并且升序输出数组元素的C++代码

2011-10-24 21:25 429 查看
今天心情由特别烂转变为特别好!!!所以决定写一篇,是实验室里做东西用到的~~

标题起的不好哈~以下代码的意思就是:合并多个有序数组,由小到大不重复地输出里面的元素值。实现的方法是将这些数组合并建最小堆,每次弹出堆顶。

具体算法:

1、将每个数组的第一个元素保存到堆中,并记录其来自哪个数组。整理堆。

2、如果堆不为空且数组没有遍历完,弹出堆顶。否则转5。

3、如果弹出的值等于上一次弹出的值last_data,将该值所在数组的下一个元素读入堆,整理堆并转2。否则转4。

4、将该值输出,将该值所在数组的下一个元素读入堆,整理堆并转2。

5、结束。

C++代码如下:

定义heap_item类:

class heap_item
{
public:
int data;
int array_id;
heap_item(int d, int i)
{
data = d;
array_id = i;
}
heap_item(const heap_item &i)
{
data = i.data;
array_id = i.array_id;
}
};
定义multi_heap类:

class multi_heap
{
private:
vector<heap_item> h;
vector<vector<int> *> header;
vector<int> ptr;
int vec_num;
int last_data;
public:
multi_heap(){vec_num=0;last_data=-1;}
~multi_heap(){}
void AddVector(vector<int> *v);
int PopMin(void);
void MakeHeap(void);
static bool cmp(heap_item a, heap_item b)
{
return a.data>b.data;
}
};
multi_heap成员函数的实现:

void multi_heap::AddVector(vector<int> *v)
{
header.push_back(v);
ptr.push_back(0);
vec_num++;
}

int multi_heap::PopMin(void)
{
if (!vec_num)
return -1;	// 表示所有vector都扫描完

int temp_ptr;
int curr_id;

// 删除重复item, 加入新item
while (!h.empty() && h[0].data == last_data)
{
curr_id = h[0].array_id;
temp_ptr = ptr[curr_id]++;
pop_heap(h.begin(),h.end(), cmp);
h.pop_back();
if (temp_ptr != header[curr_id]->size())
{
heap_item item((*header[curr_id])[temp_ptr], curr_id);
h.push_back(item);
push_heap(h.begin(), h.end(), cmp);
}
else
vec_num--;	// 当一个vector扫描结束,vector总数减少1
}
// pop最小item的值
if (!h.empty())
{
last_data = h[0].data;
curr_id = h[0].array_id;
temp_ptr = ptr[curr_id]++;
pop_heap(h.begin(), h.end(), cmp);
h.pop_back();
if (temp_ptr != header[curr_id]->size())
{
heap_item item((*header[curr_id])[temp_ptr], curr_id);
h.push_back(item);
push_heap(h.begin(), h.end(), cmp);
}
else
vec_num--;	// 当一个vector扫描结束,vector总数减少1
return last_data;
}
else
return -1;	// 完成
}

// add in the first item of all vectors
void multi_heap::MakeHeap(void)
{
if (vec_num)
{
for (int i=0; i<vec_num; i++)
{
heap_item item((*header[i])[0],i);
h.push_back(item);
ptr[i] = 1;
}
make_heap(h.begin(), h.end(), cmp);
}
}


主函数:

int main(void)
{
int arr1[] = {1,2,4,9,10};
int arr2[] = {1,5,6,7,10,11,17};
int arr3[] = {3,4,5,7,8,9,13,14,15,16};
vector<int> v1(arr1,arr1+5);
vector<int> v2(arr2,arr2+7);
vector<int> v3(arr3,arr3+10);

multi_heap my_heap;
my_heap.AddVector(&v1);
my_heap.AddVector(&v2);
my_heap.AddVector(&v3);

my_heap.MakeHeap();
int data = my_heap.PopMin();
while (data != -1)
{
cout << data << " ";
data = my_heap.PopMin();
}

system("pause");
return 0;
}


用到的头文件是:

<iostream>

<vector>

<algorithm>

运行输出为:1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17

PS:编码风格不太好请见谅哈~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐