###実現したいこと
ヒープソートで配列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が大きいことになってしまいます。
途中経過を出力したりしてみましたが原因がわかりません。
どうしてこのようになるのか教えてください。
###コード
C
1//ヒープソート 2#include<stdio.h> 3 4//aとbの値を交換する関数 5void swap(int *a,int *b) 6{ 7 int tmp; 8 tmp=*b; 9 *b=*a; 10 *a=tmp; 11} 12 13//ヒープソート 14void heap_sort(int a[],int n) 15{ 16 int i,j,k,h[n],w; 17 18 h[0]=a[0]; 19 for(k=1;k<n;k++){ 20 i=k; 21 h[i]=a[i]; //新しいデータを一番下段・左から詰めた最後にi●仮置きします 22 j=(i-1)/2; 23 while (1){ 24 if(h[j]>h[i]){ //親jのデータが子iのデータよりも大きければ 25 swap(&h[j],&h[i]); //二つのデータを交換します 26 i=j; //ヒープ条件を調べる子をj 27 j=(i-1)/2; //親をjの親のように更新します 28 }else{ 29 break; 30 } 31 } 32 } 33 /* 34 printf("ソ\ート前 "); 35 for(i=0;i<n;i++){ 36 printf("%d ",h[i]); 37 } 38 printf("\n"); 39 */ 40 //ソートする 41 i=1,j=0; 42 int num=n; //配列hのデータ数 43 for(k=0;k<n;k++){ 44 i=1,j=0; 45 a[k]=h[0]; //取り除いて別に用意するソート列の最初に置きます. 46 h[0]=h[num-1]; //ヒープの空いた場所に,ヒープの一番最後のデータを移動します● 47 num--; //ヒープのデータ数を1減らします 48 //printf("ソ\ート中 "); 49 /* 50 for(w=0;w<num;w++){ 51 printf("%d ",h[w]); 52 } 53 */ 54 55 while(i<num){ 56 //printf("j=%d i=%d\n",j,i); 57 //printf("while中 \n"); 58 /* 59 for(w=0;w<num;w++){ 60 printf("%d ",h[w]); 61 } 62 */ 63 64 if(h[j]>h[i]){ //親が子よりも大きい場合 65 if(h[2*j+1]<h[2*(j+1)]){ //子の中で小さい方と交換すること 66 //printf("h[2*j+1]=%d\n",h[2*j+1]); 67 swap(&h[2*j+1],&h[j]); 68 j=i; 69 i=2*(j+1); //下の段へ 70 }else{ 71 //printf("h[2*(j+1)]=%d\n",h[2*(j+1)]); 72 swap(&h[2*(j+1)],&h[j]); 73 j=i; 74 i=2*(j+1); 75 } 76 }else{ 77 //printf("while出る\n"); 78 break; 79 } 80 } 81 82 83 } 84 85} 86 87 88int main(void) 89{ 90 int i,n,a[10]; 91 printf("n="); 92 scanf("%d",&n); 93 for(i=0;i<n;i++){ 94 scanf("%d",&a[i]); 95 } 96 heap_sort(a,n); 97 98 printf("\n"); 99 for(i=0;i<n;i++){ 100 printf("%d ",a[i]); 101 } 102 103 return 0; 104}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 13:20