質問: ### 実現したいこと ヒープソートで配列`a`を小さい順に並べたい。 ### 問題点 できたとき。 ``` n=7 34 12 54 23 72 345 100 12 23 34 54 72 100 345 ``` できないとき。 ``` n=10 2 6 3 213 12 543 84 23 15 100 2 3 6 12 15 23 84 213 100 543 ``` 213より100が大きいことになってしまいます。 途中経過を出力したりしてみましたが原因がわかりません。 どうしてこのようになるのか教えてください。 ### コード ``` //ヒープソート #include //aとbの値を交換する関数 void swap(int *a,int *b) { int tmp; tmp=*b; *b=*a; *a=tmp; } //ヒープソート void heap_sort(int a[],int n) { int i,j,k,h[n],w; h[0]=a[0]; for(k=1;kh[i]){ //親jのデータが子iのデータよりも大きければ swap(&h[j],&h[i]); //二つのデータを交換します i=j; //ヒープ条件を調べる子をj j=(i-1)/2; //親をjの親のように更新します }else{ break; } } } /* printf("ソ\ート前 "); for(i=0;ih[i]){ //親が子よりも大きい場合 if(h[2*j+1]
回答: 質問のコードがよく分からないので、全部書き直してみました。 ``` #include #define swap(x, y) (c = x, x = y, y = c) void heap_sort(int a[], int n) { int c, i, j, k = 0; while (++k < n) for (j = k; j > 0 && a[i = (j-1)/2] < a[j]; j = i) swap(a[i], a[j]); while (--k > 0) { swap(a[0], a[k]); for (i = j = 0; ; j = i) { c = (j + 1) * 2; // c: right child of j if (c > k) break; if (a[c-1] > a[i]) i = c-1; // c-1: left child of j if (c < k && a[c] > a[i]) i = c; if (i == j) break; swap(a[i], a[j]); } } } int main(void) { int i,n,a[10]; printf("n="); scanf("%d",&n); for(i=0;ih[i]){ //親が子よりも大きい場合 - if(h[2*j+1]