qsort(weights, n, sizeof(int), compare);
时间: 2024-11-25 18:13:49 浏览: 20
`qsort()` 函数是 C 标准库中的一个函数,用于对数组进行快速排序。它通常用于整数数组,参数解释如下:
1. `weights`:这是一个指向整型数组的指针,存储了待排序的数据元素。
2. `n`:表示数组的长度,即元素的数量。
3. `sizeof(int)`:这是第三个参数,指定每个元素占用的字节数,这里假设是 `int` 类型,如果数据不是整数类型,应替换为实际大小。
4. `compare`:这是一个比较函数指针,告诉 `qsort()` 如何确定元素的顺序。这个函数一般接收两个整数作为参数,返回值通常是它们的相对顺序(如 `<0`, `0`, 或 `>`)。
例如,如果你有一个整数数组 `weights` 和一个自定义的比较函数 `myCompare`,你可以这样调用 `qsort` 来对数组按升序排列:
```c
void myCompare(const void *a, const void *b) {
return (*(const int*)a - *(const int*)b);
}
// 使用qsort对weights数组进行排序
qsort(weights, n, sizeof(int), myCompare);
```
相关问题
C语言读入n个字符所对应的权值,构造一棵哈夫曼树,自底向上生成每一个字符对应的哈夫曼编码,并依次输出。输入的第一行包含一个正整数n,表示共有n个字符需要编码。其中n不超过100。 第二行中有n个用空格隔开的正整数,分别表示n个字符的权值。共n行,每行一个字符串,表示对应字符的哈夫曼编码,保证每次左子树比右子树的权值小;如出现相同权值的,则先出现的在左子树
以下是C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
// 哈夫曼树节点
typedef struct node {
int weight; // 权值
char symbol; // 字符
struct node *left; // 左子树
struct node *right; // 右子树
} Node;
// 哈夫曼编码
typedef struct code {
char symbol; // 字符
char *bits; // 编码
} Code;
// 比较函数,用于排序
int compare(const void *a, const void *b) {
return ((Node *)a)->weight - ((Node *)b)->weight;
}
// 构造哈夫曼树
Node *build_huffman_tree(int *weights, int n) {
int i;
Node **nodes = (Node **)malloc(n * sizeof(Node *));
Node *root;
// 初始化节点
for (i = 0; i < n; i++) {
nodes[i] = (Node *)malloc(sizeof(Node));
nodes[i]->weight = weights[i];
nodes[i]->symbol = i + 'A';
nodes[i]->left = NULL;
nodes[i]->right = NULL;
}
// 构造哈夫曼树
while (n > 1) {
// 排序
qsort(nodes, n, sizeof(Node *), compare);
// 取出两个权值最小的节点
Node *left = nodes[0];
Node *right = nodes[1];
// 新建一个节点,其权值为左右节点的权值之和
Node *parent = (Node *)malloc(sizeof(Node));
parent->weight = left->weight + right->weight;
parent->left = left;
parent->right = right;
// 将新节点插入到数组中
nodes[0] = parent;
// 缩小数组范围
n--;
memmove(nodes + 1, nodes + 2, n * sizeof(Node *));
}
// 返回根节点
root = nodes[0];
free(nodes);
return root;
}
// 生成哈夫曼编码
void generate_codes(Node *root, char *bits, int depth, Code *codes, int *count) {
if (root->left == NULL && root->right == NULL) {
// 叶子节点,保存编码
codes[*count].symbol = root->symbol;
codes[*count].bits = strdup(bits);
(*count)++;
} else {
// 非叶子节点,递归遍历左右子树
bits[depth] = '0';
generate_codes(root->left, bits, depth + 1, codes, count);
bits[depth] = '1';
generate_codes(root->right, bits, depth + 1, codes, count);
}
}
int main() {
int n, i;
int weights[MAX_N];
char bits[MAX_N];
Code codes[MAX_N];
Node *root;
// 读入字符权值
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &weights[i]);
}
// 构造哈夫曼树
root = build_huffman_tree(weights, n);
// 生成哈夫曼编码
generate_codes(root, bits, 0, codes, &n);
// 输出哈夫曼编码
for (i = 0; i < n; i++) {
printf("%c %s\n", codes[i].symbol, codes[i].bits);
free(codes[i].bits);
}
// 释放内存
free(root);
return 0;
}
```
输入示例:
```
5
7 5 2 4 9
A
B
C
D
E
```
输出示例:
```
C 000
D 001
B 010
A 011
E 1
```
一个商人带着一个能装m千克的背包取乡下收购货物,准备将这些货物卖到城里获利。现有n种货源,且知第i种货物有wi(i是下标)千克,可获利pi(i是下标)元,请编写算法帮助商人收购货物,以获取最高的利润(请使用贪婪算法设计)c语言编写
为了使用贪婪算法解决这个问题,我们可以按照每种货物单位重量的利润(即价格除以重量的比例pi/wi)从高到低排序。然后,依次将价值最大的货物加入背包,直到达到背包容量m为止。这是因为在每一步中,我们都选择当前最优的选择,希望能最大化总利润。
以下是使用C语言实现的简单版本,假设数组`profits`存储了每个货物的利润,`weights`存储了它们的重量:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义货物结构体
typedef struct {
int weight;
int profit;
} Item;
// 比较函数,用于对货物按照单位重量利润降序排列
int compare_items(const void *a, const void *b) {
Item *item_a = (Item *)a;
Item *item_b = (Item *)b;
return item_b->profit / item_b->weight - item_a->profit / item_a->weight;
}
int main() {
int m, n;
printf("Enter the maximum weight of the backpack (m): ");
scanf("%d", &m);
// 获取货物信息
printf("Enter the number of items (n): ");
scanf("%d", &n);
Item items[n];
for (int i = 0; i < n; ++i) {
printf("Weight and profit of item %d: ", i + 1);
scanf("%d %d", &items[i].weight, &items[i].profit);
}
// 对货物按单位利润降序排序
qsort(items, n, sizeof(Item), compare_items);
// 初始化总利润
int total_profit = 0;
// 背包剩余空间
int remaining_weight = m;
// 遍历并选择最高利润的商品
for (int i = 0; i < n && remaining_weight > 0; ++i) {
if (items[i].weight <= remaining_weight) {
total_profit += items[i].profit;
remaining_weight -= items[i].weight;
} else {
total_profit += items[i].profit * (remaining_weight / items[i].weight);
break; // 如果还有空间,就放满;若不够,则停止填充
}
}
printf("The maximum profit is: %d\n", total_profit);
return 0;
}
```
阅读全文