/*
http://d...content-available-to-author-only...o.jp/qa/question_detail/q14117785524
このコードの流用による不具合の責任を上記URLの回答者・質問者・サイト
運営者に問うことはできません。
*/
#include<stdio.h>
#define MAX 10
static int check_heap(int a[],int n);
static void insert(int val,int a[], int* N);
static void swap(int* a,int* b);
static int deletemin(int a[], int *n);
int main(void){
int dat[MAX]={41,13,29,96,7,86,4,10,90,64};
int heap[MAX];
int i,result;
int n=0;
int min;
//関数呼び出し
for(i=0;i<MAX;i++)insert(dat[i],heap,&n);
for(i
=0;i
<MAX
;i
++)printf("%d ",heap
[i
]);
while(n>0){
min=deletemin(heap,&n);//関数呼びだし
for(i
=0;i
<MAX
;i
++)printf("%d ",heap
[i
]); result=check_heap(heap,n);//関数呼びだし
if(result
==1)printf("ヒープ条件を満たしています.\n");else printf("ヒープ条件を満たしていません.\n"); }
return 0;
}
//ヒープ条件を満たしているかチェックする関数
int check_heap(int a[],int n){
int i,left,right;
for(i = 0; i < n; i++) {
left=2*i+2;
right=left+1;
if(right<=n)if(a[right-1] < a[i]) return 0;
if(left<=n)if(a[left-1] < a[i]) return 0;
}
return 1;
}
//新しく値を挿入する関数
void insert(int val,int a[], int* N){
int n;
a[(*N)++]=val;
n=*N;
while(n>1){
if( a[n-1] > a[n/2-1] )break;
swap(&a[n-1],&a[n/2-1] );
n/=2;
}
}
//値を入れ替える関数
void swap(int* a,int* b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
//ヒープの最小値を取り除く関数
//負の値を返した場合は*N<=0
int deletemin(int a[], int *N){
int result;
int n;
if(*N<=0)return -1;
result=a[0];
swap(&a[0],&a[*N-1]);
(*N)--;
n=1;
while(n<=*N){
if(2*n>*N)break;
if(2*n+1<=*N){
if(a[2*n]<a[2*n-1]){
if(a[2*n]<a[n-1]){
swap(&a[2*n],&a[n-1]);
n*=2;
n++;
continue;
}
}
}
if(a[n-1]>a[2*n-1]){
swap(&a[n-1],&a[2*n-1]);
n*=2;
continue;
}
break;
}
return result;
}
LyoKaHR0cDovL2QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLm8uanAvcWEvcXVlc3Rpb25fZGV0YWlsL3ExNDExNzc4NTUyNArjgZPjga7jgrPjg7zjg4njga7mtYHnlKjjgavjgojjgovkuI3lhbflkIjjga7osqzku7vjgpLkuIroqJhVUkzjga7lm57nrZTogIXjg7vos6rllY/ogIXjg7vjgrXjgqTjg4gK6YGL5Za26ICF44Gr5ZWP44GG44GT44Go44Gv44Gn44GN44G+44Gb44KT44CCCiovCiNpbmNsdWRlPHN0ZGlvLmg+CgojZGVmaW5lIE1BWCAxMApzdGF0aWMgaW50IGNoZWNrX2hlYXAoaW50IGFbXSxpbnQgbik7CnN0YXRpYyB2b2lkIGluc2VydChpbnQgdmFsLGludCBhW10sIGludCogTik7CnN0YXRpYyB2b2lkIHN3YXAoaW50KiBhLGludCogYik7CnN0YXRpYyBpbnQgZGVsZXRlbWluKGludCBhW10sIGludCAqbik7CgppbnQgbWFpbih2b2lkKXsKaW50IGRhdFtNQVhdPXs0MSwxMywyOSw5Niw3LDg2LDQsMTAsOTAsNjR9OwppbnQgaGVhcFtNQVhdOwppbnQgaSxyZXN1bHQ7CmludCBuPTA7CmludCBtaW47CgoJLy/plqLmlbDlkbzjgbPlh7rjgZcKCWZvcihpPTA7aTxNQVg7aSsrKWluc2VydChkYXRbaV0saGVhcCwmbik7CgoJZm9yKGk9MDtpPE1BWDtpKyspcHJpbnRmKCIlZCAiLGhlYXBbaV0pOwoJcHJpbnRmKCJcblxuIik7CgoJd2hpbGUobj4wKXsKCQltaW49ZGVsZXRlbWluKGhlYXAsJm4pOy8v6Zai5pWw5ZG844Gz44Gg44GXCgkJcHJpbnRmKCLjg5Ljg7zjg5fjga7mnIDlsI/lgKTjga8lZOOBp+OBmVxuIixtaW4pOwoJCWZvcihpPTA7aTxNQVg7aSsrKXByaW50ZigiJWQgIixoZWFwW2ldKTsKCQlwcmludGYoIlxuIik7CgkJcmVzdWx0PWNoZWNrX2hlYXAoaGVhcCxuKTsvL+mWouaVsOWRvOOBs+OBoOOBlwoJCWlmKHJlc3VsdD09MSlwcmludGYoIuODkuODvOODl+adoeS7tuOCkua6gOOBn+OBl+OBpuOBhOOBvuOBmS5cbiIpO2Vsc2UgcHJpbnRmKCLjg5Ljg7zjg5fmnaHku7bjgpLmuoDjgZ/jgZfjgabjgYTjgb7jgZvjgpMuXG4iKTsKCQlwcmludGYoIlxuIik7Cgl9CgoKCXJldHVybiAwOwp9CgovL+ODkuODvOODl+adoeS7tuOCkua6gOOBn+OBl+OBpuOBhOOCi+OBi+ODgeOCp+ODg+OCr+OBmeOCi+mWouaVsAppbnQgY2hlY2tfaGVhcChpbnQgYVtdLGludCBuKXsKaW50IGksbGVmdCxyaWdodDsKCWZvcihpID0gMDsgaSA8IG47IGkrKykgewoJCWxlZnQ9MippKzI7CgkJcmlnaHQ9bGVmdCsxOwoJCWlmKHJpZ2h0PD1uKWlmKGFbcmlnaHQtMV0gPCBhW2ldKSByZXR1cm4gMDsKCQlpZihsZWZ0PD1uKWlmKGFbbGVmdC0xXSA8IGFbaV0pIHJldHVybiAwOwoJfQoJcmV0dXJuIDE7Cn0KCi8v5paw44GX44GP5YCk44KS5oy/5YWl44GZ44KL6Zai5pWwCnZvaWQgaW5zZXJ0KGludCB2YWwsaW50IGFbXSwgaW50KiBOKXsKaW50IG47CglhWygqTikrK109dmFsOwoJbj0qTjsKCXdoaWxlKG4+MSl7CgkJaWYoIGFbbi0xXSA+IGFbbi8yLTFdIClicmVhazsKCQlzd2FwKCZhW24tMV0sJmFbbi8yLTFdICk7CgkJbi89MjsKCX0KfQoKLy/lgKTjgpLlhaXjgozmm7/jgYjjgovplqLmlbAKdm9pZCBzd2FwKGludCogYSxpbnQqIGIpewppbnQgdGVtcDsKCXRlbXA9KmE7CgkqYT0qYjsKCSpiPXRlbXA7Cn0KCi8v44OS44O844OX44Gu5pyA5bCP5YCk44KS5Y+W44KK6Zmk44GP6Zai5pWwCi8v6LKg44Gu5YCk44KS6L+U44GX44Gf5aC05ZCI44GvKk48PTAKaW50IGRlbGV0ZW1pbihpbnQgYVtdLCBpbnQgKk4pewppbnQgcmVzdWx0OwppbnQgbjsKCWlmKCpOPD0wKXJldHVybiAtMTsKCXJlc3VsdD1hWzBdOwoJc3dhcCgmYVswXSwmYVsqTi0xXSk7CgkoKk4pLS07CgluPTE7Cgl3aGlsZShuPD0qTil7CgkJaWYoMipuPipOKWJyZWFrOwoJCWlmKDIqbisxPD0qTil7CgkJCWlmKGFbMipuXTxhWzIqbi0xXSl7CgkJCQlpZihhWzIqbl08YVtuLTFdKXsKCQkJCQlzd2FwKCZhWzIqbl0sJmFbbi0xXSk7CgkJCQkJbio9MjsKCQkJCQluKys7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0KCQl9CgkJaWYoYVtuLTFdPmFbMipuLTFdKXsKCQkJc3dhcCgmYVtuLTFdLCZhWzIqbi0xXSk7CgkJCW4qPTI7CgkJCWNvbnRpbnVlOwoJCX0KCQlicmVhazsKCX0KCXJldHVybiByZXN1bHQ7Cn0=