中國大學MOOC-陳越、何欽銘-資料結構-2018秋——堆中的路徑
阿新 • • 發佈:2018-12-05
我的中國大學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++解題報告: