函数一
void min_heapify(int arr[],int n, int i){
int j, temp;
temp = arr[i];
j = 2 * i;
while (j <= n)
{
if (j < n && arr[j+1] < arr[j])
j = j + 1;
if (temp < arr[j])
break;
else if (temp >= arr[j])
{
arr[j/2] = arr[j];
j = 2 * j;
}
}
arr[j/2] = temp;
}
函数二
void max_heapify(int arr[], int n, int i)
{
int largest = i; // Initialize largest as root
int l = 2*i + 1; // left = 2*i + 1
int r = 2*i + 2; // right = 2*i + 2
// If left child is larger than root
if (l < n && arr[l] < arr[largest])
largest = l;
// If right child is larger than largest so far
if (r < n && arr[r] < arr[largest])
largest = r;
// If largest is not root
if (largest != i)
{
swap(arr[i], arr[largest]);
// Recursively heapify the affected sub-tree
heapify(arr, n, largest);
}
}
问题详情
这里堆化的工作方式与创建 min_heap 的方式相同,但问题是,我在下面这个问题中使用了堆来解决它,但不幸的是,我通过观看麻省理工学院讲座实现的函数 2 对这个问题不起作用,在看了之后有一段时间在网络上我发现第一个函数可以无缝地解决这个问题。我只是很困惑,它们不是相同的功能吗? ------
问题
是的!!问题名称反射(reflect)了您的任务;只需添加一组数字。但是您可能会觉得自己居高临下,编写 C/C++ 程序只是为了添加一组数字。这样的问题只会质疑你的博学。因此,让我们为它添加一些独创性。
加法运算现在需要成本,成本是这两个相加的总和。因此,要将 1 和 10 相加,您需要花费 11。如果要将 1、2 和 3 相加。有几种方法 –
1 + 2 = 3, cost = 3
1 + 3 = 4, cost = 4
2 + 3 = 5, cost = 5
3 + 3 = 6, cost = 6
2 + 4 = 6, cost = 6
1 + 5 = 6, cost = 6
Total = 9
Total = 10
Total = 11
我希望您已经了解您的任务,即添加一组整数以使成本最小。
输入
每个测试用例将以一个正数 N (2 ≤ N ≤ 5000) 开头,后跟 N 个正整数(均小于 100000)。输入在 N 的值为零的情况下终止。这种情况不应被处理。
输出
对于每种情况,在一行中打印最小的加法总成本。
示例输入
3
1 2 3
4
1 2 3 4
0
示例输出
9
19
最佳答案
函数2中的swap
函数有问题。
C是按值调用的,所以
swap(arr[i], arr[largest]);
不能交换数组中的值。
交换函数需要交换值的地址:
swap(int *v1, int *v2) {
int tmp = *v1;
*v1 = *v2;
*v2 = tmp;
}
调用将是:
swap(&arr[i], &arr[largest]);
关于c++ - 混淆了堆的两种不同实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641593/