哈弗曼树(纯C++编写,可以看看奥♪(^∀^●)ノ)

在这里插入图片描述
题目来源:点击---------------------------------------------链接

解题思路:

按照题目的要求解题,简单明了,易懂!

360截图17430811356850.png

这个就是我们的解题思路,就是不断的把最小的两个数找出来,然后加在一起,把这两个数存在一个数组中,同时把以前的两个最小的数用这个数替换掉,然后用递归的思路做,直到最后只剩下一个数为止。

运用到的东西

1. 数组a

这里的数组a可以理解是动态数组,数组的长度是在减少的

因为我们总是把数组a中的最小的两个值加在一起,然后替换掉这两个值

把加在一起的值存到数组b里面去

2. 数组b,存储数组a中的值,其实这里的数组b是可以不要的,要着主要是方便理解这个过程

3. 累加的sum,这里的累加的使用其实就是求最后的权值,累加的值是数组b中的值
4. STL中的sort排序函数————咳咳,个人比较懒,直接就用这个排序函数了(其实不懒的,说我懒我也不会承认的。)

关于sort函数的使用在参考代码的下面有。

注意事项:

注意数组的长度在改变,循环一次,长度减少一个,原因就是最小的两个数合在一起了,长度自然就减少了

个人理解:

1》这个题目其实用队做是更好的

2》哈夫曼树的权值的计算我一直都是画成树再用路径来算的,这种想法是非常的狭隘的,如果这个题目构造成树再来解的话会非常的麻烦。

因而可见对一个知识的理解的深度是相当重要的,不然会很吃亏d(╯﹏╰)b 咕~~

原创参考代码:

#include <iostream>
 #include <algorithm>
 bool complare(int a,int b)
{
return a>b;
}
 using namespace std;
 int main(int argc, char *argv[])
 {
 int length;
 cin>>length;
 int a[length];
 for(int i=0;i<length;i++)
 cin>>a[i];
 int n=length-1,b[n],sum=0;
 for(int j=0;j<n;j++)
 {
  sort(a,a+length,complare);
  b[j]=a[length-1]+a[length-2];
  sum+=b[j];
  length--;
  a[length-1]=b[j];
 }
 cout<<sum;
 return 0;
 }

C++sort()函数的用法
近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧!
(一)为什么要用c++标准库里的排序函数
Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!
(二)c++标准库里的排序函数的使用方法
I)Sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!II)Sort函数有三个参数:

  1. 第一个是要排序的数组的起始地址。
  2. 第二个是结束的地址(最后一位要排序的地址)
  3. 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

Sort函数使用模板:
Sort(start,end,排序方法)
下面就具体使用sort()函数结合对数组里的十个数进行排序做一个说明!

例一

sort函数没有第三个参数,实现的是从小到大

#include<iostream>
#include<algorithm>
using namespace std;int main()
    { 
    int a[10]={9,6,3,8,5,2,7,4,1,0};
     for(int i=0;i<10;i++)
      cout<<a[i]<<endl;
    sort(a,a+10);
     for(int i=0;i<10;i++) 
     cout<<a[i]<<endl; return 0;
    }

例二

通过上面的例子,会产生疑问:要实现从大到小的排序肿么办?
这就如前文所说需要在sort()函数里的第三个参数里做文章了,告诉程序我要从大到小排序! 需要加入一个比较函数
complare(),此函数的实现过程是这样的

bool complare(int a,int b)
{
 return a>b;
 }

这就是告诉程序要实现从大到小的排序的方法!

#include< iostream >
#include< algorithm >
usingnamespace std;bool complare(int a,int b)
    { 
    return a>b;
    }
    int main()
    { 
    int a[10]={9,6,3,8,5,2,7,4,1,0};
     for(int i=0;i<10;i++)
      cout<<a[i]<<endl;
     sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,//这是规则
     for(int i=0;i<10;i++)
      cout<<a[i]<<endl;
       return 0;
    }

例三:

通过上面例一、二的方法虽然实现了从大到小和从大到小的排序,这样做还是有点麻烦,因为还需要自己编写告诉程序进行何种排序的函数,c++标准库强大的功能完全可以解决这种麻烦。
Sort函数的第三个参数可以用这样的语句告诉程序你所采用的排序原则
less<数据类型>()//从小到大排序greater<数据类型>()//从大到小排序结合本例子,这样的就可以完成你想要的任何一种排序原则了

#include< iostream >
#include< algorithm >
using namespace std;
int main()
{ 
int a[10]={9,6,3,8,5,2,7,4,1,0};
 for(int i=0;i<10;i++)
  cout<<a[i]<<endl;
sort(a,a+10,less< int >());
 for(int i=0;i<10;i++)
  cout<<a[i]<<endl;
   return 0;
}




#include< iostream >
#include< algorithm >
using namespace std;
int main()
{ 
int a[10]={9,6,3,8,5,2,7,4,1,0}; 
for(int i=0;i<10;i++) 
 cout<<a[i]<<endl;
 sort(a,a+10,greater< int >());
  for(int i=0;i<10;i++)
   cout<<a[i]<<endl;
   return 0;
}

例四

利用sort函数还可以实现对字符的排序,排序方法大同小异,下面就把程序范例展示一下

#include< iostream >
#include< algorithm >
using namespace std;int main()
{ 
char a[11]="asdfghjklk"; 
for(int i=0;i<10;i++) 
cout<<a[i]<<endl;
 sort(a,a+10,greater< char >());
  for(int i=0;i<10;i++)
  cout<<a[i]<<endl;
   return 0;
}

《以》《下》《是》《我》《的》《闲》《扯》《,》《不》《要》《在》《意》《。》(┬_┬)

个人以前喜欢刷题,可以看一下下面这个图:

在这里插入图片描述不过好久都没刷了,刚刚看到的心仪的学校很看重编程,决定重新拾起宝刀,在代码的世界,编程的世界,打下一片属于自己的天下,哎,老久不看,排名下降的厉害。。。上面还写了23篇文章,这个是从我那里面复制过来的,以后打算在dotcpp以及力库(┬_┬)网上偶尔刷刷题,陶怡一下情操。坚持更新博客。
力库才申请的。。。
在这里插入图片描述可爱的大Q宝。
在这里插入图片描述分类很棒!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值