2020/5/19总结

堆和哈夫曼树

今天学习了一些关于堆和哈夫曼树相关知识,了解了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

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值