首页 > 试题广场 >

以下程序执行后控制台输出为________? #inc

[单选题]
以下程序执行后控制台输出为()
#include <stdio.h>
void g1(int *a, int n, int i){
    while (2 * i <= n){
        int j = 2 * i;
        int v = a[j - 1];
        if (j < n && v < a[j]){
            v = a[j];
            j += 1;
        }
        if (a[i - 1] < v){
            int tmp = a[i - 1];
            a[i - 1] = v;
            a[j - 1] = tmp;
            i = j;
        } else{
            break;
        }
    }
}
int g2(int *a, int n, int m){
    int i;
    for (i = n / 2; i > 0; --i)
        g1(a, n, i);
    for (i = 0; i < n && a[i] != m; ++i);
    int j = 0;
    for (++i; i > 0; i /= 2)
        ++j;
    return j;
}
int main(int argc, char* argv[]){
    int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
    int n = sizeof(a) / sizeof(a[0]);
    printf("%d", g2(a, n, 8));
    return 0;
}
  • 3
  • 4
  • 5
  • 7
<p>I是8. 2的3次幂</p>
发表于 2020-12-07 14:53:03 回复(0)
建立大顶堆,8的索引为7,在第4层。
发表于 2019-04-09 11:24:31 回复(0)
这种题就应该屏蔽好吗?有什么意义?
发表于 2022-07-05 20:37:22 回复(1)
。。。
发表于 2021-12-07 08:52:11 回复(0)
size of(a)=64,n=16,上面的一堆没什么用,然后i=7,做

   for (++i; i > 0; i /= 2)

        ++j;

j=4
发表于 2020-09-17 23:48:25 回复(1)
for (++i; i > 0; i /= 2)
        ++j;  i此时是15,++i 是16,为什么最后输出j是 4,不是应该是5吗
发表于 2023-10-08 18:21:51 回复(1)
手搓过堆排序,一眼看出来大根堆,但是后面没看出来
发表于 2023-07-10 21:02:26 回复(0)
堆的建立
发表于 2022-10-28 21:50:35 回复(0)
还好我喜欢从后往前看,才发现上面一坨都没用😂
发表于 2022-08-08 13:29:25 回复(0)
怎样才能看懂这道题
发表于 2022-05-22 12:44:21 回复(0)
这道题能做,就是耗时,g1的作用就是将数组后半部分的数据与前半部分数据交换
发表于 2022-05-19 11:36:45 回复(0)
原来是建立大顶堆。。。
发表于 2020-10-02 17:45:29 回复(0)