0
# Sort an array a[0...n-1].
gaps = [701, 301, 132, 57, 23, 10, 4, 1]

foreach (gap in gaps)
    # Do an insertion sort for each gap size.
    for (i = gap; i < n; i += 1)
        temp = a[i]
        for (j = i; j >= gap and a[j - gap] > temp; j -= gap)
            a[j] = a[j - gap]
        a[j] = temp

これはWikipediaページの疑似コードです。私のC ++コードが正しいかどうかはわかりません。これが私のコードです:

void shellSort(int *array, int array_size)
{
  int e, i, j, temp;
  for(e = 0; e < array_size; e++)
  {
      for( i = e; i < array_size; i++)
      {
          temp = array[i];
          for( j = i; j >= e && array[j - e] > temp; j -= e)
          {
             array[j] = array[j-e];
          }
          array[j] = array[temp];
      }

  }
}

そして、ここに私のテストコードがあります:

int main()
{
    int sizes[9] = {9,3,5,7,1,0,6,2,4};
    int size = 0;
    shellSort(sizes,size);

    for(int i=0;i<size;i++)
    {
        cout << sizes[i] << endl;
    }

return 0;

}

しかし、画面には何も表示されません。

4

2 に答える 2

2

よし、上から撮ろう

void shellSort(int *array, int array_size)
{

あなたのコードは必要なギャップ配列を完全に省略しました

  const int gaps[] = {701, 301, 132, 57, 23, 10, 4, 1};
  int e, i, j, temp;

外側のループは、0 から array_size ではなく、ギャップをまたぐ必要があります

  for(e = 0; e < sizeof(gaps)/sizeof(int); ++e)
  {
      int gap = gaps[e];

内側のループでギャップ配列のギャップを使用する必要があります

      for( i = gap; i < array_size; ++i)
      {
          temp = array[i];
          for( j = i; j >= gap && array[j - gap] > temp; j -= gap)
          {
             array[j] = array[j-gap];
          }

一時を配列に戻す必要があります

          array[j] = temp;
      }

  }
}

注: 手元にコンパイラがないので、確認していませんが、正しいと思います。

また、いくつかのマイナーなポイント、これ:

  int e, i, j, temp;

代わりに、使用する各変数を宣言します。つまり、代わりに次のようにします。

      for( int i = gap; i < array_size; ++i)
      {
          int temp = array[i];
于 2013-03-05T13:30:09.047 に答える
1

何らかの理由で (コメントはありませんでした)、私の最初の回答は削除されました (タイプミス - サイズを 9 ではなく 0 に設定しました)。質問は、なぜ「画面に何も表示されない」のか疑問に思いました。size を 0 に設定すると、for ループが 0 から < size まで反復するときに何をすると予想されますか?

アルゴリズムを見る前に、パラメータが正しい必要があります。そこから始めましょう。何かが画面にダンプされた場合は、アルゴリズムのデバッグを開始できます (出力が間違っていた場合)。出力が正しければ、アルゴリズムはおそらく問題ありません。

これについて私が間違っている場合は、私の回答にコメントを投稿してください。「消す」だけじゃない!?!

于 2013-03-15T13:05:39.933 に答える