(八)王道机试指南___哈夫曼

算例一

  • 题目描述

  • 解题思路

①哈夫曼树:给定n 个结点和它们的权值,以它们为叶子结点构造一棵带权路径和最小的二叉树,该二叉树即为哈夫曼树,同时也被称为最优树

②转化为:取数组里最小两个数,合并后记录权值,将权值放入数组,并重复操作,直到只有一个数位置,最后把每次的权值加起来

  • 解题代码

#include<stdio.h>
#include<stdlib.h>
//排序函数
int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}
int main()
{
	int n, i, TWeight;
	int array[1001];
	while (scanf("%d", &n) != EOF)
	{
		//输入节点
		for (i = 0;i < n;i++)
		{
			scanf("%d", &array[i]);
		}
		TWeight = 0;
		//所有结点的值与权值的乘积之和
		for (i = 0;i < n - 1;i++)
		{
			//排序
			qsort(array + i, n - i, sizeof(array[0]), cmp);
			TWeight += (array[i] + array[i + 1]);
			array[i + 1] = array[i] + array[i + 1];
		}
		printf("%d\n", TWeight);
	}
	return 0;
}
  • 注意点

①记住自定义比较函数的写法:

int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}

//....

qsort(str,n,sizeof(str[0]),cmp);
//   数组名 个数 每个大小 比较函数

②qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

qsort要求提供的函数是需要自己定义的一个比较函数,比较函数使得qsort通用性更好。有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。

如int cmp(const void *a, const void *b)中有两个元素作为参数(参数的格式不能变的。)返回一个int值

如果比较函数返回大于0,qsort就认为a > b,返回小于0,qsort就认为a < b。qsort知道元素的大小了,就可以把大的放前面去。如果你的比较函数返回本来应该是1的(即a > b),而却返回-1(小于0的数),那么qsort认为a < b,就把b放在前面去,但实际上是a > b的,所以就造成了降序排序的差别了。简单来说,比较函数的作用就是给qsort指明元素的大小事怎么比较的。

几种经典用法:

//一、对int类型数组排序
int num[100];
int cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}
qsort(num, 100, sizeof(num[0]), cmp);

//二、对char类型数组排序(同int类型)
char word[100];
int cmp(const void *a, const void *b)
{
	return *(char *)a - *(char *)b;
}

qsort(word, 100, sizeof(word[0]), cmp);

//三、对double类型数组排序(特别要注意)
double in[100];
int cmp(const void *a, const void *b)
{
	return *(double *)a > *(double *)b ? 1 : -1;
}
//返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失。
qsort(in, 100, sizeof(in[0]), cmp);

//四、对结构体一级排序
struct In
{
	double data;
	int other;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写 
int cmp(const void *a, const void *b)
{
	return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1;
}

qsort(s, 100, sizeof(s[0]), cmp);

//五、对结构体二级排序

struct In
{
	int x;
	int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序 
int cmp(const void *a, const void *b)
{
	struct In *c = (In *)a;
	struct In *d = (In *)b;
	if (c->x != d->x) return c->x - d->x;
	else return d->y - c->y;
}

qsort(s, 100, sizeof(s[0]), cmp);

猜你喜欢

转载自blog.csdn.net/weixin_40614231/article/details/88409262