堆和哈夫曼树
今天学习了一些关于堆和哈夫曼树相关知识,了解了C++里面的sort函数和优先队列。
这是我的学习成果:
sort函数使用方法:
1.sort函数的三个参数
void sort(random first,random second,compare comp)
(1) 第一个参数 first:是要排序的数组的起始地址。
(2) 第二个参数 second:是要排序的数组的结束地址。
(3) 第三个参数 comp:是要排序的方法:可以升序也可以降序,如果第三个参数不写,则默认的排序方法是从小到大排序。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[]={5,2,1,3,4}
sort(a,a+5);
for(int i=0;i<5;i++)
printf("%d ",a[i]);
}
运行结果为:1 2 3 4 5
#include <iostream>
#include <algorithm>
bool cmp(int a,int b);
using namespace std;
int main()
{
int a[]={5,2,1,3,4}
sort(a,a+5,cmp);
for(int i=0;i<5;i++)
printf("%d ",a[i]);
}
bool cmp(int a,int b)
{
return a>b;
}
运行结果为:5 4 3 2 1
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
char s[10];
int m;
int n;
};
bool cmp(node a,node b)
{
if(a.m!=b.m)
return a.m<b.m;把m从小到大排序
else if(a.m == b.m)
return a.n>b.n;把n从大到小排序
}
int main()
{
node a[5]={{"abc",70,80},{"hahaha",101,50},{"http",101,60}};
sort(a,a+3,cmp);
for(int i=0;i<3;i++)
{
printf("%s %d %d\n",a[i].s,a[i].m,a[i].n);
}
return 0;
}
输出结果:
abc 70 80
http 101 60
hahaha 101 50
2.对容器类型来说,容器数据类型是多样化
(1)元素自身有比较关系,像int,double 等基础类型,可以直接进行比较
greater< int >() 递减的 less< int >() 递增的
#include <algorithm>
#include <cstdio>
#include <queue>
#define MAX 20000
using namespace std;
int main()
{
int s[]={2,3,5,1,4};
vector<int>arr(s,s+5);//容器
sort(arr.begin(),arr.end(),greater<int>());
for(int i=0;i<arr.size();i++)
printf("%d ",arr[i]);
}
运行结果:5 4 3 2 1
(2)元素本身是strcut类内部需要重载< 运算符,进行元素比较
#include <algorithm>
#include <cstdio>
#include <queue>
#define MAX 20000
using namespace std;
struct node
{
char s[10];
int m;
bool operator < (const node &x)const{
return m>x.m;
}
};
int main ()
{
node a[5] = { {"abc", 70}, {"hahaha", 101}, {"http", 101}};
sort(a,a+3);
for (int i = 0; i < 3; i++) {
printf("%s %d\n", a[i].s, a[i].m);
}
return 0;
}
运行结果:
hahaha 101
http 101
abc 70
3.优先队列
#include <bits/stdc++.h>
using namespace std;
/// 最大值先输出的优先队列 容器为 vector , 可以重载()运算符
struct cmp {
bool operator()(int x, int y) { return (x > y); }
};
priority_queue<int, vector<int>, cmp> q;
//优先队列,cmp从大到小排,在队列中top位置是最小值
int main() {
int n;
int sum, i;
while (cin >> n) {
for (i = 1; i <= n; i++) {
cin >> num;
q.push(num);//优先队列,放入队列中就会自动排序
}
int ans=0;//记录最小加和
while (!q.empty()) {
int x1 = q.top();
q.pop();
if (!q.empty()) {
int x2 = q.top();
q.pop();
ans+=x1+x2;
q.push(x1+x2);
}
}
cout << ans << endl;
}
return 0;
}
输入:
6
6 2 1 4 5 3
运行结果:51