一段合并多个有序数组并且升序输出数组元素的C++代码
2011-10-24 21:25
429 查看
今天心情由特别烂转变为特别好!!!所以决定写一篇,是实验室里做东西用到的~~
标题起的不好哈~以下代码的意思就是:合并多个有序数组,由小到大不重复地输出里面的元素值。实现的方法是将这些数组合并建最小堆,每次弹出堆顶。
具体算法:
1、将每个数组的第一个元素保存到堆中,并记录其来自哪个数组。整理堆。
2、如果堆不为空且数组没有遍历完,弹出堆顶。否则转5。
3、如果弹出的值等于上一次弹出的值last_data,将该值所在数组的下一个元素读入堆,整理堆并转2。否则转4。
4、将该值输出,将该值所在数组的下一个元素读入堆,整理堆并转2。
5、结束。
C++代码如下:
定义heap_item类:
主函数:
用到的头文件是:
<iostream>
<vector>
<algorithm>
运行输出为:1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17
PS:编码风格不太好请见谅哈~
标题起的不好哈~以下代码的意思就是:合并多个有序数组,由小到大不重复地输出里面的元素值。实现的方法是将这些数组合并建最小堆,每次弹出堆顶。
具体算法:
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:编码风格不太好请见谅哈~
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/6bb3f2a2eb81f326445a31770403c7f1.gif)
相关文章推荐
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- C++ - 不重复地输出升序数组中的元素
- 微软面试题——整数升序数组、数M,输出和为M的两个数组元素
- 有序数组的合并 c++模板实现
- 【iOS开发-44】通过案例谈iOS代码重构:合并、格式化输出、宏变量、利用数组字典存储数据,以及利用plist的终极知识
- 算法有序数组合并---在空间足够的情况下,进行O(n)的合并 并且移动次数最小
- 对于一个有序(升序排列)的数组a,查找所有比i(i不在a中)大的数,请写出关键代码
- 用3位以内的随机整数填充长度为20的整型数组,然后使用冒泡排序法按升序进行排序,输出排序后的数组元素(每行输出10个元素)。
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- 编写html表格输出的时候有时候会出现同一列连续出现两行或者是三行的数据内容一样,并且我们想将这些行合并起来,这个时候我们就需要以下这些代码
- Summary Ranges 有序数组找出连续的子数组并且输出
- C 语言,将两个数组合并到另外一个数组中,并且合并之后的数组是有序的。
- 两个有序数组的合并排序,Java代码实现,并去重复,考虑空间利用率问题
- 加载exe的PE信息并输出相关PE信息的一段c++代码
- 20140729 while((*pa++=*pb++)!='\0') 合并数组代码 C++类型转换关键字 封装 多态 继承
- 两个有序数组的合并排序,Java代码实现,并去重复,考虑空间利用率问题
- C++实现:合并两个有序的数组,合并后的数组依然有序
- 将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。
- C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
- 4.将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。