ヒープソートについて

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

ヒープソートについて

#1

投稿記事 by あや » 18年前

C言語を勉強しはじめて一週間ほどなのですが、
ヒープソートの宿題がでました。
どういう順番でソートしていくのかは色々なサイトを見て理解したのですが、
それを式にするのができなく、2.3日悩んでおります;;
整数{45,3,35,40,18,50,18,1,11,2,15,9,5,30,25}の15こをヒープソートで
並べ替えるというものです。
検索をかけてみると、まだ私の知らない関数?が沢山出てきまして、
使えるのはfor、if、elseくらいなのですが、
長くなっても構わないので、初心者な式で教えていただけないでしょうか・・・。
よろしくお願いします!

Microsoft Visual C++ 2005 Express Editionを使っております。
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[/url])
{

	int i,j,k,n,w; 
	int a[15]={ 8, 1, 10, 15, 45, 3, 35, 19, 46, 7, 40, 18, 50, 11, 2 };


	for( i = n/2; i >= 1; i--)
	{
		j = i;
		while( 1 )
		{
			if( 2*j > n ){ break ;}
			if( 2*j == n )
			{
				if ( a[j] < a[2*j] )
					{
					w = a[j];
					a[j] = a[2*j];
					a[2*j] = w;
					}
				break;
			} 
			else 
			{
			if( a[2*j] < a[2*j+1] ) { k = 2*j+1; } else{ k = 2*j; }
			if( a[j] > a[k] )
				{
				w = a[j];
				a[j] = a[k];
				a[k] =w;
				j = k;
			}
		
			}
		}
	}

	for( i = 1; i<= n; i++)
	{
		printf("%d ", a);
	}
	return ;
}

りむ

Re:ヒープソートについて

#2

投稿記事 by りむ » 18年前

>C言語を勉強しはじめて一週間ほどなのですが、
ヒープソートの宿題がでました。

凄く進み方の早い授業ですね。C言語を習い始めて7日ほどでヒープソートとは…。

>検索をかけてみると、まだ私の知らない関数?が沢山出てきまして、
使えるのはfor、if、elseくらいなのですが、

while文はわかりますか?わかるならそれら4つを用いるだけで十分に実現可能です。
ただし、ヒープソートは、字のごとく「ヒープ」という特殊なデータ構造を用いているので、
その概念を理解する必要があります。
配列で実現可能なデータ構造なので、配列さえ覚えればあとは簡単だと思います。
グーグル先生で一度検索をかけてみましょう。

肝心のソースですが、これはどこかのサイトからもってきたものですか?
まず1行目に問題点がいきなりあるので、それを把握しましょう。
#include <stdio.h>というものはとてもよく使われますが知っていますか?
これは入出力の標準関数を実装するためにIncludeするもので、これがないとprintf関数が使えません。

そしてまことに申し訳ないのですが#include "stdafx.h"は良くわかりません。
ただ、これがなくても支障はないはずです。

そしてmain関数ですが、何もしないプログラムの場合、
int main(int argc, char* argv[/url]){
      return 0;
}
となります。授業や本によって書き方や教え方が違うかもしれませんが…。
ここでソースの方の問題点は2つ、_TCHAR*という不明な型を指定しています。
そして、int型のmain関数なので、値を返すように指定されているのにreturn;ではまずいです。
少なくとも、return 0; としましょう。

これ以上は長くなりすぎるのであと1つでやめますが、
nの値ですが…いきなり 
for( i = n/2; i >= 1; i--) 
の部分で、値を代入していないのに割り算をしています。nには、この時点では0ですらも入っていません。
これではまずいので、nに配列の最大数を入れましょう。

まだ基礎がしっかりしていないようなので、Cに関する入門書を一から読み直しましょう。
それからきちんと理解したうえで宿題を終えて出すなら、どんな先生だろうと納得するでしょう。
頑張ってください。

バグ

Re:ヒープソートについて

#3

投稿記事 by バグ » 18年前

#include "stdafx.h"

このヘッダーファイルはMFCをサポートするアプリケーションの為のファイルです。MFCを使用しない限り必要ありませんよ(^-^)

りむ

Re:ヒープソートについて

#4

投稿記事 by りむ » 18年前

>#include "stdafx.h"

そうなのですね…
コンソールアプリケーション、もしくはWindowsアプリケーションで
いつも作っていたのでこれは見たことなかったです。
ありがとうございます。

管理人

Re:ヒープソートについて

#5

投稿記事 by 管理人 » 18年前

スマートなプロジェクトならこちらがいいです。

http://www.play21.jp/board/formz.cgi?ac ... =8682#8664

あや

Re:ヒープソートについて

#6

投稿記事 by あや » 18年前

素早い回答ありがとうございました。
Microsoft Visual C++ 2005 Express Editionの新規作成で
Win32 コンソールアプリケーションで作るように言われていまして、
そこは最初から勝手に入るものですから・・・
ヘッダファイルに、#include <stdio.h>が入ってるんです。
nの値・・・本当にただ箱を作っただけでした・・
ソースは調べたり本を見たり色々自分で組み合わせたものなので、
どこからかコピーしてきたわけではないのですが・・


>>そして、int型のmain関数なので、値を返すように指定されているのにreturn;ではまずいです。
少なくとも、return 0; としましょう。

わかりました!0で返すという意味もわかっていませんでした・・お恥ずかしいです。
勉強しなおしてまた色々考えてみます<(_ _)>管理人様ありがとうございました。

管理人

Re:ヒープソートについて

#7

投稿記事 by 管理人 » 18年前

Win32 コンソールアプリケーションで、「空のプロジェクト」にチェックをいれて作成すれば、空の状態から始まりますよ^^
プロジェクトを作るとき、ウィンドウが現れて、名前をつけてOKを押した後、ウィザードが現れて、「次へ」「完了」と進んでいくと思いますけど、次へを押した先のウィンドウに「空のプロジェクト」にチェックをいれる欄があったと思います。
そこにチェックをいれておけば空のプロジェクトになります。
ファイルの追加方法などは上記リンク先の紹介と同じですので、一度やってみてください☆

りむ

Re:ヒープソートについて

#8

投稿記事 by りむ » 18年前

そうでした、私も常に空のプロジェクトで作っていたので、
それを指定しない場合は良く知らないのでした;;
その場合、そのインクルードが入るのですね…勉強になります。

あや

Re:ヒープソートについて

#9

投稿記事 by あや » 18年前

空の状態から作ったことがなかったので、大変勉強になりましたっ
一つ一つクリアしていきたいと思います。
丁寧で管理人様の人柄がわかりますね^^。
初めて書き込みしてみて、勇気がわきました。ありがとうございました(^▽^*)ノ

閉鎖

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