我的中国大学MOOC-陈越、何钦铭-数据结构-2018秋代码仓:https://github.com/617076674/MOOC-DataStructure-2018-Autumn
题目描述:
知识点:堆
思路:新建堆
注意,必须根据题意来,将新元素加入堆尾,上浮调整。如果对整个数组采用下沉调整策略,会出错。
建堆的时间复杂度是O(logN)。空间复杂度是O(N)。
C++代码:
#include<iostream>
#include<vector>
using namespace std;
int N, M, heap[1000], index = 0;
void insert(int num);
void upAdjust(int low, int high);
void printFather(int num);
int main(){
scanf("%d %d", &N, &M);
int num;
for(int i = 0; i < N; i++){
scanf("%d", &num);
insert(num);
}
for(int i = 0; i < M; i++){
scanf("%d", &num);
printFather(num - 1);
}
return 0;
}
void insert(int num){
heap[index] = num;
upAdjust(0, index);
index++;
}
void upAdjust(int low, int high){
int i = high, j = (high - 1) / 2;
while(j >= low){
if(heap[j] > heap[i]){
swap(heap[i], heap[j]);
i = j;
j = (i - 1) / 2;
}else{
break;
}
}
}
void printFather(int num){
vector<int> fathers;
while(num >= 0){
fathers.push_back(heap[num]);
if(num == 0){
break;
}
num = (num - 1) / 2;
}
for(int i = 0; i < fathers.size(); i++){
printf("%d", fathers[i]);
if(i != fathers.size() - 1){
printf(" ");
}else{
printf("\n");
}
}
}
C++解题报告: