2012-04-26 18 views
1

私はクイックソートを7000文字列の配列をアルファベット順にソートしようとしていますが、空白の出力ファイルがあります。私のbubblesortメソッドでうまく動作しますが、これでは動作しません。私はそれが明らかな間違いであると確信していますが、私はそれを特定できません。クイックソートに建てられた?:QuickSort in C++

のstd ::ソート(& namesArray [0]、& namesArray [のgetSizeを(使用についてどのように

quicksort(0,GetSize() -1,namesArray); 
+6

デバッガにアクセスできますか?デバッガの使い方を知っていることは貴重なスキルです。もしあなたが使っていれば、あなたはすでにあなたの答えを持っているでしょう。 –

+1

宿題の場合は、そのまま宿題にしてください。そうでなければ 'std :: sort'を使ってください。 –

+1

ここをクリックしてください:http://en.wikipedia.org/wiki/Quicksort –

答えて

4

:私はこのようなメソッドを呼び出す

void ArrayStorage::quicksort(int first, int last, string list[]) 
{ 
     int middle, p, index; 
    string temp, partition; 
    if (first < last) 
    { 
      middle = int(first + last)/2; 
      temp = list[middle]; 
      list[middle] = list[first]; 
      list[first] = temp; 
      partition = list[first]; 
      p = first; 
      for (index = first + 1; index <= last; index++) 
      { 
        if(list[index] < partition) 
        { 
          p = p + 1; 
          temp = list[index]; 
          list[index] = list[p]; 
          list[p] = temp; 
        } 
      } 
      temp = list[first]; 
      list[first] = list[p]; 
      list[p] = temp; 
      quicksort(first, p - 1, list); 
      quicksort(p + 1, last, list); 
    } 
} 

)]));

+0

ええ、申し訳ありませんが、私はstd sortと私自身の並べ替えを比較しているはずです。なぜなら、parasoftとprofilingを使ってパフォーマンスやものをやっているからです。 –

+0

temp = list [index]; list [index] =リスト[p]; list [p] = temp; std :: swap(list [index]、list [p]);でスワップします。 –

+0

Viktorさん、ありがとうございました。私はそれを修正することができた後、15msで私のクイックソートをスピードアップしました。 –

1

クイックソートの各ループの原則は、temp変数を、それよりも小さいすべての要素がtempに置き換えられ、より大きな要素が右側に置かれる位置に設定することです。したがって、ループでなければならないのは、tempよりも大きい数とleftよりも大きい数があれば、検索するための右回りの繰り返しが両方とも含まれているということです。存在する場合は、現在のコンテンツを反対側に置き、リストの全体的な反復まで反対側から反復します。ループの後、tempより小さいすべての要素は左側にあり、大きな要素は右側にある必要があります。

temp = list[first]; 
int f = first, l = last; 
while (f < l) 
{ 
    while ((f <= l) && (list[l] < temp)) l--; 
    if (f <= l) 
    { 
     list[f] = list[l]; 
     f++; 
    } 
    while ((f <= l) && (list[f] > temp)) f++; 
    if (f <= l) 
    { 
     list[l] = list[f]; 
     l--; 
    } 
} 

コードのこの作品は、動作するはずです。(私は、このコンピュータ上のコンパイラを持っていない)、それは、再帰関数自体を起動しようとしない場合。

さらに、アドバイスがあります。多くの人があなたにお勧めしているように、デバッグを試みて問題を自分で解決してください。

希望する

+0

私はそれをデバッグしようとしていますが、ビジュアルスタジオではアセンブリコードにジャンプし続け、それはちょうど私の心を吹き飛ばします。それは名前とすべてを取り入れているので、まるで何も出力していないかのようです。しかし、それはすべきであり、私の知る限りでは、コードは理にかなっています。 :s –

+0

@Rhys次に、デバッグシンボルでコンパイルしていないか、またはstd関数に入っているかのいずれかの2つのうちの1つです。あなたがデバッグモードですべてをコンパイルしていることを確認し、それを書いていなければ関数に降りません。 –