为什么这个地方要将哈夫曼树的权值由大到小排列。

for(i=0;i<256;i++)
{                    //按出现权值从大到小排序
    for(j=i+1;j<256;j++){
        if(header[i].count<header[j].count){
            tmp=header[i];
            header[i]=header[j]; 
            header[j]=tmp; 
        } 
    } 
}
for(i=0;i<256;i++)                    //找到第一个空的header结点
    if(header[i].count==0) 
        break; 
n=i;       //因为权值已经从大到小排列并且找到了第一个空的header结点,所以这句话代表现有所有结点个数 (n) 
m=2*n-1;    //m代表哈夫曼树中需要的所有的结点个数 
for(i=n;i<m;i++) // m=2*n-1
{
    min1=999999999;                //预设的最大权值,即结点出现的最大次数
    for(j=0;j<i;j++)
    {
        if(header[j].parent!=-1) 
            continue;                /*parent!=-1说明该结点已存在哈夫曼
                                树中,跳出循环重新选择新结点*/
        if(min1>header[j].count) //代表不在哈夫曼树中 
        {    
            pt1=j; //j是下标 
            min1=header[j].count; 
            continue;    
        } 
    }
    header[i].count=header[pt1].count; 
    header[pt1].parent=i;      
    header[i].lch=pt1;   
    min1=999999999;   
    for(j=0;j<i;j++){
        if(header[j].parent!=-1) 
            continue;                                        
        if(min1>header[j].count)
        {
            pt1=j; 
            min1=header[j].count; 
            continue; 
        } 
    }
    header[i].count+=header[pt1].count; 
    header[i].rch=pt1;   
    header[pt1].parent=i;            //哈夫曼无重复前缀编码 
}

而哈夫曼树(Huffman Tree)是在叶子结点和权重确定的情况下,带权路径长度最小的二叉树,也被称为最优二叉树。
--链接转自 最全哈夫曼树哈夫曼编码讲解,兄弟你值得拥有_记录博主学到的点滴-CSDN博客 目录 1.哈夫曼树的概念        路径概念        路径长度概念        节点的带权路径长度        树的带权路径长度 2.构建哈夫曼树的步骤 3.构建哈夫曼树的完整代码 4.哈夫曼编码1.哈夫曼树的概念在正式 https://blog.csdn.net/qq_45737068/article/details/106910349
想要得到一颗哈夫曼树,就应该每次找到权值最小的两个点的权值和作为他们两个点的根节点,这样做的目的是用最大的深度乘以最小的权重。所以为了每次都取最小的两个值,就需要把数组排列一下。