ページ 11

quicksortについて

Posted: 2013年11月14日(木) 01:10
by primary
quicksortのどこが間違っているのかよくわかりません。
単語を辞書順(逆)に出力したいんですが、一部の単語は入れ替えを行われていないようです。何回も繰り返すと正しい結果が出ます。
誰か教えていただけませんか。よろしくお願いします。

コード:

void quick_sort(char a[][WORD_LENGTH_MAX], int left, int right) {

  char temp_char[1][WORD_LENGTH_MAX];

  int l = left;
  int r = right;
  int s;

  s = (left + right) / 2;

  while(1){
    while(stricmp(a[l], a[s]) > 0) l++;
    while(stricmp(a[s], a[r]) > 0) r--;
    if(l >= r) break;

    strcpy(temp_char[0], a[l]);
    strcpy(a[l], a[r]);
    strcpy(a[r], temp_char[0]);

    l++;
    r--;

  }

  if(left < l - 1)
    quick_sort(a, left, l - 1);
  if(right > r + 1)
    quick_sort(a, r + 1, right);

}

Re: quicksortについて

Posted: 2013年11月14日(木) 07:48
by みけCAT
入れ替えの過程でaが書き換えられる可能性があるのがまずいかもしれません。
ピボットを別のバッファに退避させてみてください。

Re: quicksortについて

Posted: 2013年11月14日(木) 09:49
by 初級者
それはそれとして、私からみると、
[1] と定義している配列は
本当に必要なのか?
という気がします。

Re: quicksortについて

Posted: 2013年11月14日(木) 11:12
by non
特に、間違っているところはないように見えますが、DEBUGしてみないとわかりません。
具体的に、mainやデータを入れた、再現性のあるプログラムを載せてもらえますか?

Re: quicksortについて

Posted: 2013年11月14日(木) 21:10
by primary
みけCAT さんが書きました:入れ替えの過程でaが書き換えられる可能性があるのがまずいかもしれません。
ピボットを別のバッファに退避させてみてください。


ご回答ありがとうございます。解決できました。

ほかの皆さんにも感謝します。