###したいこと
配列array_intをヒープ条件に合うように並び替えたい。
###条件
なるべく関数を書き換えたくないです。(名称は絶対に)
xcode
c++
###欲しい情報
解決方法に関する情報
###結果
1
0
0
0
1886912525
1835627109
1635020389
1634557804
1701535600
121
###コード
c++
1#include<iostream> 2 3int *array_int;//{1,13,14,60,15,91,24,71,80,63}; 4double *array_dob; 5int mode = 0; 6 7int size = 3; 8 9using namespace std; 10 11template <class X>void swap(X *a, X *b){ 12 X box = *a; 13 *a = *b; 14 *b = box; 15} 16 17int check_heap(){ 18 19 int j=0; 20 21 for (int i=1; i<size; i++) { 22 23 if (i%2 == 1) { 24 j = (i-1)/2; 25 }else{ 26 j=i/2-1; 27 } 28 29 if (mode == 0) { 30 if (array_int[i] < array_int[j]) { 31 return 0; 32 } 33 }else if (mode == 1){ 34 if (array_dob[i] < array_dob[j]) { 35 return 0; 36 } 37 } 38 39 } 40 41 return 1; 42} 43 44void shift_down(){ 45 46 int i=0,j=0; 47 48 if (mode == 0) { 49 50 51 while (!check_heap()) { 52 53 if (array_int[2*i+1] > array_int[2*i+2]) { 54 j = 2*i+2; 55 }else{ 56 j = 2*i+1; 57 } 58 59 swap(&array_int[i],&array_int[j]); 60 61 i = 2*i+1; 62 } 63 64 65 }else if (mode == 1){ 66 67 while (!check_heap()) { 68 69 if (array_dob[2*i+1] > array_dob[2*i+2]) { 70 j = 2*i+2; 71 }else{ 72 j = 2*i+1; 73 } 74 75 swap(&array_dob[i],&array_dob[j]); 76 77 i = 2*i+1; 78 } 79 } 80 81} 82 83template<typename var>void insert(var val){ 84 85 ///メモリ確保&代入 86 size++; 87 88 if (mode == 0) { 89 90 if ((array_int = (int*)realloc(array_int, sizeof(int)*size))==NULL) { 91 cout << "I can't get enough size memory. SORRY" << endl; 92 } 93 94 array_int[size-1] = val; 95 96 }else if (mode == 1){ 97 98 if ((array_dob = (double*)realloc(array_dob, sizeof(double)*size))==NULL) { 99 cout << "I can't get enough size memory. SORRY" << endl; 100 } 101 102 array_dob[size-1] = val; 103 104 } 105 ///メモリ確保終了&代入 106 107 int i=size-1,j = 0; 108 109 while (!check_heap()) { 110 111 if (i%2 == 1) { 112 j = (i-1)/2; 113 }else{ 114 j=(i-2)/2; 115 } 116 117 if (mode == 0) { 118 swap(&array_int[i], &array_int[j]); 119 }else if (mode == 1){ 120 swap(&array_dob[i], &array_dob[j]); 121 } 122 123 shift_down(); 124 125 i=j; 126 } 127 128} 129 130template <typename var>var deletemin(){ 131 132 var returner = 0.0; 133 134 if (mode == 0) { 135 reterner = array_int[0]; 136 swap(&array_int[0],&array_int[size-1]); 137 }else if(mode == 1){ 138 reterner = array_dob[0]; 139 swap(&array_dob[0],&array_dob[size-1]); 140 } 141 size--; 142 143 array_int = (int*)realloc(array_int, sizeof(int)*size); 144 145 shift_down(); 146 147 return returner; 148} 149 150int HeapSort(){ 151 152 int *aps = (int*)malloc(sizeof(int)*size); 153 int i=0; 154 int past = size; 155 156 size = 1; 157 aps[0] = array_int[0]; 158 159 for (i=size; i<past; i++) { 160 insert(aps[i]); 161 } 162 163 free(array_int); 164 array_int = aps; 165 166 return 0; 167} 168 169int main(){ 170 171 size = 10; 172 173 array_int = (int *)malloc(sizeof(int)*size); 174 array_int[0] = 1; 175 array_int[1] = 13; 176 array_int[2] = 14; 177 array_int[3] = 60; 178 array_int[4] = 15; 179 array_int[5] = 91; 180 array_int[6] = 24; 181 array_int[7] = 71; 182 array_int[8] = 80; 183 array_int[9] = 63; 184 185 HeapSort(); 186 187 for (int i=0; i<size; i++) { 188 printf("%d\n",array_int[i]); 189 } 190 191 192 free(array_int); 193 194 return 0; 195} 196
提示のコードではどういう動作になるんでしょうか。
エラーが出るならエラーメッセージを提示しましょう
回答1件
あなたの回答
tips
プレビュー