• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ヒープソートがわかりません)

ヒープソートが動かない理由とは?

このQ&Aのポイント
  • ヒープソートのプログラムを作成したが、うまく動かない。何が間違っているのかを教えてください。
  • ヒープソートのアルゴリズムを使用したプログラムを作成しましたが、正しく動作しません。どのようなエラーが発生しているのでしょうか?
  • ヒープソートのプログラムを実装しましたが、結果が正しくありません。何が原因でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

ヒープソートとか以前の問題。 >main(int argc, char *argv[]) { で >char s[NS][WC], buff[WC]; って定義して >heapsort(s[NS+1][WC],n); と呼ぶと「2次元配列sの(NS+1,WC)番目の要素と、n」を引数に渡す事になる。 つまり、これは main(int argc, char *argv[]) { で char c; って定義して heapsort(c,n); と呼んでいるのと同じ。 「1番目の引数にcharを渡してる」って事が理解出来て無い。 自分が heapsort('a',n); って書いてるのと同じだって事が理解出来ないうちは「出直しておいで」としか言えない。 しかも >char s[NS][WC] って定義してるなら、1次元目は「0~NS-1」、2次元目は「0~WC-1」までしか存在しない。 NSが3000000で、WCが40なら、sの添字は、s[0][0]からs[2999999][39]の範囲しか取れない。 >s[NS+1][WC] にアクセスすると、その実体は「配列の外」になるので、最悪の場合「メモリアクセス違反で例外を起こす」事になる。 >void heapsort(int s[NS+1][WC], int n) { しかも、呼ばれてる関数の方は、引数の定義が違うし。 まずは「配列の引数渡し」を理解してから。 それが理解できたら、その次に >while(fgets(buff, sizeof(buff),fp)!=NULL){ >sscanf(buff,"%s",&s[i]); >i=n; >} のループの中で「iとnの値がどうなってるか?」を考えよう。 ぶっちゃけ、ファイルから配列に読み込むのさえ、マトモに書けてない。 そんなレベルで「ヒープソートが動かない」って言うのは、自分の習得レベルが理解出来て無いって意味で、情けないと思う。まるで生まれたてのLv1の勇者が、素手でLv300のラスボスに戦いを挑んでるみたい。