前提・実現したいこと
各ノードにID(整数)とコスト(整数)のペアが保持され, 親ノードの保持する「コスト」が子ノードの保持する「コスト」より小さいという性質を持つヒープを構築したいです。以下の要領に従って実装したいです。
- id(int 型)とcost(int 型)をメンバとした構造体node を定義する.
- node を型とする大きさ30の配列node data を(大域変数として)用意する.
- node data の要素の初期値として,各要素のIDは配列のインデックス番号と同
じ値に(ID は0から29),コストは0から100までのランダムな値とする.
(これを関数gen node dataで行う.)
4. 上で説明したように,(また,ヒープソートでヒープを構築したように)コストに
関したヒープを構築する.(これを関数make heapで行う。)
5.(適切にヒープが構築されているかを確認するため)配列の各要素の値(IDとコ
スト)を出力する.(これを関数print heap で行う.)
発生している問題
down_heap()とmake_heap()を作成したのですが, エラーは出なかったものの昇順にソートできていません。どこに原因があるのかが分からないので教えてほしいです。ノードの使い方にも慣れていないので教えてほしいです。
id: 0, cost: 30 id: 1, cost: 16 id: 2, cost: 23 id: 3, cost: 69 id: 4, cost: 13 id: 5, cost: 74 id: 6, cost: 96 id: 7, cost: 13 id: 8, cost: 89 id: 9, cost: 92 id: 10, cost: 86 id: 11, cost: 6 id: 12, cost: 12 id: 13, cost: 56 id: 14, cost: 10 id: 15, cost: 84 id: 16, cost: 78 id: 17, cost: 82 id: 18, cost: 73 id: 19, cost: 52 id: 20, cost: 95 id: 21, cost: 29 id: 22, cost: 75 id: 23, cost: 33 id: 24, cost: 24 id: 25, cost: 79 id: 26, cost: 21 id: 27, cost: 20 id: 28, cost: 48 id: 29, cost: 77 id: 0, cost: 1 id: 16, cost: 23 id: 3, cost: 4 id: 13, cost: 74 id: 6, cost: 7 id: 13, cost: 89 id: 9, cost: 10 id: 86, cost: 6 id: 12, cost: 13 id: 56, cost: 10 id: 15, cost: 84 id: 16, cost: 78 id: 17, cost: 82 id: 18, cost: 73 id: 19, cost: 52 id: 20, cost: 95 id: 21, cost: 29 id: 22, cost: 75 id: 23, cost: 33 id: 24, cost: 24 id: 25, cost: 79 id: 26, cost: 21 id: 27, cost: 20 id: 28, cost: 48 id: 29, cost: 77 id: 0, cost: 0 id: 0, cost: 0 id: 0, cost: 540410064 id: 0, cost: 0 id: 0, cost: 0
該当のソースコード
C++
1#include<iostream> 2#include<random> 3using namespace std; 4 5#define N 30 6#define MAX_COST 100 7 8struct node { 9 int id; 10 int cost; 11}; 12 13node node_data[N]; 14 15void gen_node_data() 16{ 17 mt19937 mt{random_device{}()}; 18 uniform_int_distribution<int> dist(0,MAX_COST); 19 20 for (int i=0; i<N; i++) { 21 node_data[i].id = i; 22 node_data[i].cost = dist(mt); 23 } 24} 25 26void swap(int a[],int i,int j) 27{ 28 int t; 29 t=a[i]; 30 a[i]=a[j]; 31 a[j]=t; 32} 33 34void down_heap(int a[],int leaf,int root) 35{ 36 int i=2*root; 37 while (i<=leaf) { 38 if (i<leaf&&a[i+1]>a[i]) 39 i++; 40 if (a[root]>=a[i]) 41 break; 42 swap(a,root,i); 43 root=i; 44 i=root*2; 45 } 46} 47 48void make_heap(int a[],int asize) 49{ 50 int i; 51 for (i=asize/2-1; i>=0; i--) { 52 down_heap(a,i,asize); 53 } 54 for (i=asize-1; i>=1; i--) { 55 int t; 56 t=a[0]; 57 a[0]=a[i]; 58 a[i]=t; 59 down_heap(a,0,i-1); 60 } 61} 62 63bool check_rightmost(int i) 64{ 65 int x = i+2; 66 while (x>1) { 67 if (x%2==1) return 0; 68 else x=x/2; 69 } 70 return 1; 71} 72 73void print_heap() 74{ 75 for (int i=0; i<N; i++) { 76 cout << "id: "; 77 cout << node_data[i].id; 78 cout << ", cost: "; 79 cout << node_data[i].cost; 80 81 if (check_rightmost(i)) cout << endl; 82 else cout << " "; 83 } 84 cout << endl; 85} 86 87int main() 88{ 89 gen_node_data(); 90 print_heap(); 91 92 for (int i=0; i<N; i++) { 93 make_heap(&node_data[i].cost,N) 94 } 95 print_heap(); 96 97 return 0; 98}
試したこと
main関数でmake_heapの()内は構造体であると同時にnode_data[i]と設定し, &をつけたらエラーは出なかったのですが, &を付けないとエラーが出ました。
補足情報(FW/ツールのバージョンなど)
C++17を使用しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。