掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27142

ソート
投稿者---root(2006/06/10 01:52:44)


ヒープソート作ってたんだけどなんかうまくいかねー。
もうかれこれ10時間以上原因をさがすけど見つからないし。
うがー。
だれかみつけられませんかね?
ってコレ投稿して数分で見つけられたらどうしよう・・・。
マジショック。

#include<stdio.h>
#define N 10

void downheap(int *data, int match)
{
  int w;
  if(match > N / 2 - 1) return;
  if(2 * match - 1< N && data[match * 2 + 1] < data[match * 2 - 1])
    w = match * 2;
  else
    w = match * 2 + 1;
  if(data[match] < data[w]){
    swap(&data[match], &data[w]);
    downheap(data, w);
  }
}

void swap(int *to, int *from)
{
  int temp;
  temp = *to;
  *to = *from;
  *from = temp;
}

int main()
{
  int data[10] = {4, 1, 7, 9, 0, 6, 3, 5, 8, 2};
  int seach;
  int i = 0;
  printf("please serch data: ");
  scanf("%d", &seach);
  while(data[i++] != seach){
    if(i > 9){
      printf("no data\n");
      return -1;
    }
  }
  if(i / 2 - 1 <= 10 && i / 2 - 1 >= 0)
    printf("parent %d\n", data[i / 2 - 1]);
  else
    printf("no parent node\n");
  if(i * 2 - 1 <= 10 && i * 2 - 1 >= 0)
    printf("child %d", data[i * 2 - 1]);
  else
    printf("no child node");
  if(i * 2 + 1 <= 10)
    printf(" %d", data[i * 2]);
  printf("\n");
  return 0;
}

int main()
{
  int node;
  int i;
  int match = 0;
  int data[N] = {7, 27, 19, 9, 10, 23, 2, 12, 4, 31};
  for(i = 0; i < N; i++){
    downheap(data, N - i);
  }
  return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ソート 27143 ぽこ 2006/06/10 03:03:33
<子記事> Re:ソート 27144 επιστημη 2006/06/10 03:21:11


No.27143

Re:ソート
投稿者---ぽこ(2006/06/10 03:03:33)


こっちは放置ですか?
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+27093


この投稿にコメントする

削除パスワード

No.27153

Re:ソート
投稿者---かずま(2006/06/11 02:45:16)


> こっちは放置ですか?
> http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+27093

その質問にコメントしようと思ったのですが、
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+27079 も
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+27034 も
放置にみえたのでやめました。

質問者と回答者のやりとりがあって、最後に質問者がまとめを書いて
スレッドを閉じるという形が気持ちいいと思うんですが、そうならない
ことがよくありますね。

愚痴を書いても仕方ないので、ヒープソートのプログラムを書いてみました。
#include <stdio.h>

#define N  10

void swap(int *data, int a, int b)
{
    int t = data[a];  data[a] = data[b];  data[b] = t;
}

void downheap(int *data, int n, int match)
{
    if (match < n / 2) {
        int w = match * 2 + 1;
        if (w + 1 < n && data[w] < data[w + 1]) w++;
        if (data[match] < data[w]) swap(data, match, w), downheap(data, n, w);
    }
}

void heapsort(int *data, int n)
{
    int i;
    for (i = n / 2; i >= 0; i--) downheap(data, n, i);
    for (i = n; --i > 0; ) swap(data, 0, i), downheap(data, i, 0);
}

int main(void)
{
    int i, data[N] = { 7, 27, 19, 9, 10, 23, 2, 12, 4, 31 };

    heapsort(data, N);
    for (i = 0; i < N; i++) printf(" %d", data[i]);
    printf("\n");
    return 0;
}
再帰を使わず、スワップの回数ももっと少なくてすむやり方があるのですが、
多分この質問者がそれを尋ねてくるとは思えないので、この話はここまでと
しましょう。


この投稿にコメントする

削除パスワード

No.27144

Re:ソート
投稿者---επιστημη(2006/06/10 03:21:11)


mainがふたつありますが。



この投稿にコメントする

削除パスワード

No.27161

Re:ソート
投稿者---acid(2006/06/12 09:23:55)


>mainがふたつありますが。

wwwwそれは、当然、コンパイラも、怒るわな。
全く、エラーログぐらい書けっての。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧