c++ - 混淆了堆的两种不同实现

标签 c++ arrays min-heap

函数一

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/

相关文章:

c++ - 排序函数和优先级队列中的比较器 C++

java - 尽管java中的PQ默认是一个min-heap,为什么有些人会重写使用PriorityQueue实现minheap的比较器函数?

c++ - 是否应该定义#if 中使用的宏?

arrays - Symfony2 : Multi-level parameters in YML

C++ set 和 shared_ptr

c - 移动数组中的元素

java - 将 java 中的命令行参数与字符数组进行比较

java - Heapify 给我的最小堆输出不正确

c++ - 如何从 GStreamer 管道读取数据中的特定字段?

C++ Switch不会使用用作大小写的外部定义变量进行编译