没有合适的资源?快使用搜索试试~ 我知道了~
首页代码c++ 最大堆最小堆
最大堆最小堆 问题的提出 给定k个排好序的序列S1,S2…,Sk,用2路合并算法将这k个序列合并成一个序列。假设所采用的2路合并算法合并2个长度分别为m和n的序列需要m+n-1次比较。试设计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。 原理分析 这个程序比较适合用堆,最优用最小堆,最差用最大堆; 以最优合并为例: (1)使用各序列的长度建堆; (2)两个最小的元素出堆,计算这两序列合并需要的比较次数,该次数入堆; (3)重复(2),直到堆只剩下一个元素; 最后剩下的元素即为题目的解。
资源详情
资源评论
资源推荐

#include<iostream>
#include<set>
using namespace std;
int main()
{
int k=4,max =0 ,min =0;//k 为带合并的序列个数,min,max 分别为所需最少和最多的比较次数
int num[] = {5,12,11,2};
set<int>myset(num,num+4);
set<int>myset2(myset);
set<int>::iterator it;
/* myset.insert(5);
myset.insert(12);
myset.insert(11);
myset.insert(2);
*/
//最少比较次数
while(myset.size() != 1)
{
it = myset.begin();//两个最小的数相加,加完后删除这两个数,并把相加的结果插入到 set
容器中
int a = *it;
myset.erase(it);
it = myset.begin();
int b = *it;
myset.erase(it);
int c = a+b;
myset.insert(a+b);
min += c-1;
}
cout<<"最少的比较次数为:"<<min<<endl;
for(it = myset2.begin(); it!=myset2.end();it++)
cout<<*it<<ends;
cout<<endl;
//计算最多比较次数
while(myset2.size() != 1)
{


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论3