ヒープソート

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

ヒープソート

#1

投稿記事 by 男子 » 15年前

Cは1年ぐらいやってます。OSはXPコンパイラはgccです。
ファイルから文字列を読み込んで辞書順にヒープソートするソースですが動きません。go,copy,hop,
,agoと4つの単語が一行に1つづつ書かれているファイルでは実行するとgo,copy,hopの3つだけが表示されます。
どこがいけないでしょうか?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void swap( char *a, char *b );
void Hpsort(char s[/url], int n);
void DownHeap(char s[/url],  int leaf, int root);

void swap( char *a, char *b )
{
char tmp;

// 文字列の入れ替え
while ( (*a != '\0') && (*b != '\0') ){
tmp = *a;
*a = *b;
*b = tmp;
a++;
b++;
}
// a 文字列が長い場合
while ( *a != '\0' ){
*b++ = *a; *a++ = '\0';
}
// b 文字列が長い場合
while ( *b != '\0' ){
*a++ = *b; *b++ = '\0';
}
*a = '\0';
*b = '\0';
}


void Hpsort(char s[/url], int n)
{
    int leaf, root;

    leaf = n;                   /* 初期値は末尾の要素 */
    root = n/2;                /* 初期値はその親 */

    while (root > 0 ) {         /* 半順序木を構成 */
        DownHeap(s, leaf, root);
        root--;
    }
    
    while(leaf > 0) {
        swap(&s[1], &s[leaf]);       /* 半順序木の根と末尾の要素を交換 */
        leaf--;                 /* 末尾の要素を半順序木から外す */
        DownHeap(s, leaf, 1);   /* 半順序木を再構成する */
    }
}



void DownHeap(char s[/url],  int leaf, int root)
{
    int i;

    i = root * 2;
    while (i <= leaf) {
        if (i < leaf &&strcmp(&s[i + 1] , &s)>0)  /* a と a[i + 1]  の大きい方と */
            i++;
        if (strcmp(&s[root], &s)>0)              /* a[root] と比較 */
            break;                        /* 子の方が大きければ */
        swap(&s[root], &s);                 /* 交換 */

        root = i;                         /* 更にその子についても調べる */
        i = root * 2;
    }
}


int main(){

int i;
FILE *fp;
char s[4][10];

fp=fopen("test.txt","r");
if(fp==NULL){
 printf("file not found\n");
 exit(0);
} 
 for(i=1;i<5;i++){
  fgets(s,10,fp);
 }

for(i=1;i<5;i++){
  printf("%s",s);
 }
 
 
 Hpsort(s[4],4);
  

for(i=1;i<5;i++){
  printf("%s",s);
 }
fclose(fp);
}

box

Re:ヒープソート

#2

投稿記事 by box » 15年前

s[4]と定義すると、アクセスできるのはs[0]~s[3]です。
C言語の配列の添字はゼロ始まりであることを今一度確認なさってください。

男子

Re:ヒープソート

#3

投稿記事 by 男子 » 15年前

返信ありがとうございます。配列のインデックスはヒープ構造にする時に1から始まった方がわかりやすいためです。

閉鎖

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