ヒープソート

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ark

ヒープソート

#1

投稿記事 by ark » 18年前

初めましてよろしくお願いします。

今C言語でソートのところを勉強していてヒープソートを作ろうとおもったのですが
どうにもうまくいきません
#include <stdio.h>

#define HMAX  50

int uu=0;

struct heap{
	int box[HMAX];
	int size;
};
                                                                                                                                                                                                                                                                                           
void swap(int *u,int *v){
	int tmp;
	tmp = *u;
	*u=*v;
	*v=tmp;
}

void create(struct heap *h){
	h->size=0;
}

void insert(struct heap *h, int item){
	int i;
	i=++h->size;
	h->box=item;
		
	while(i>1 && h->box < h->box[i/2]){			
				
				swap(&h->box , &h->box[i/2]);
				i/=2;
	}

}

int findmin(struct heap *h){
	return(h->box[1]);
}

void deletemin(struct heap *h){
	int i,k;
	i=1;
	h->box[1] = h->box[h->size];
	--h->size;
	while(2*i <= h->size){
		k=2*1;
		if(k < h->size && h->box[k] > h->box[k+1]){
			k++;
		}
		if(h->box <= h->box[k]){
			break;
		}
		swap(&h->box,&h->box[k]);
		
		i=k;
	}
}


int main(void){
	
	struct heap b;
	int no,ans,ape;
	
	printf("要素挿入?yes...1  no...0");fflush(stdout);
	scanf("%d",&ans);
	
	if(ans==1){
	
		while(ans==1){
			create(&b);
			printf("\nどんな数値を入力しますか?\n");fflush(stdout);
			scanf("%d",&no);
			insert(&b,no);
			printf("続行?yes...1  no...0");fflush(stdout);
			scanf("%d",&ans);
			uu++;
    	}

		for(ape=1;ape<=uu;ape++){
			b.box[ape] = findmin(&b);
			printf("%d ",b.box[ape]);fflush(stdout);
			deletemin(&b);
			
		}

		printf("Heap sort is over.");fflush(stdout);
	}

  return 0;
}


デバッグするとdeleteminがおかしいと思うのですが、何が間違っているのかわかりません。
どうか教えていただけないでしょうか、お願いします。

Re:ヒープソート

#2

投稿記事 by » 18年前

えっと、質問です。
fflush();
って何で使っているのでしょうか?
良く分からなかったので…

とりあえず、
b.box[ape] = findmin(&b);
のとき、b.box[0]には何が入っているんでしょうか?
無視しても良いみたいですが…不思議です。

void insert(struct heap *h, int item){
int i;
i=++h->size;
h->box=item;

while(i>1 && h->box < h->box[i/2]){

swap(&h->box , &h->box[i/2]);
i/=2;
}

}
これのwhileは実行されているのでしょうか?
i=1でi>1ですよね?

実行はきちんとされているかと思います。
ただ、配列へのデータの受け渡しがうまく思った通りにいっていないのでは?
そう思います。
どうやって代入しているかいまいち良く分からなかったので、指摘出来ませんが…

box

Re:ヒープソート

#3

投稿記事 by box » 18年前

deletemin()の
k=2*1;
は、
k = 2 * i;
が正しいでしょうか?
「イチ」ではなくて「アイ」だと思うのですけれど。

それから、main()のwhile文の中で毎回
create()
を実行しているのは正しいのでしょうか?
ヒープの情報を毎回初期化しているように見えるのですけれど。

ark

Re:ヒープソート

#4

投稿記事 by ark » 18年前

>>雷様

fflushはprintfの次にscanf等がきた場合に実行したときになにかしら文字などをいれてからでないと表示んさかったことがあり、それが嫌なのでつけるようにしています。

iはh->sizeをインクリメントしているので1ではないです。
配列の代入などがかなり曖昧にしかわかっていないのでエラーがでないようにしただけです^^;

>>box様

おっしゃるとおりiの書き間違えでした…見落としてました・・・
あとcreateもwhileの中にいれても結果同じだと思うのですが、聞いてみるとなんかそんな感じもするので、box様のとおり考えてみます。

お二方ありがとうございました。
考えてきます!

閉鎖

“C言語何でも質問掲示板” へ戻る