2016-11-02 26 views
0

私は本のいくつかの行をシャッフルしており、それらの単語もシャッフルされています。私はクイックソートアルゴリズムを使用してそれらをソートしたい。私は線を並べ替え、うまくいった。私はこのように各行をソートしようとしました。C++はほとんど同じコードを出力します

for each (Line l in lines) { 
    srand(255); 
    l.quicksort(0, l.words.size() - 1); 
    for each (Word w in l.words) 
     cout << w.content << " "; 
    cout << endl; 
} 

私はランダムなクイックソートを使用しているためです。このループは私に正しい結果をもたらします。しかし、私はこのようにもう一度書こうとしました。

for each (Line l in lines) { 
    for each (Word w in l.words) 
     cout << w.content << " "; 
    cout << endl; 
} 

クイックソート機能を呼び出さなかったような出力が得られます。 1行が抜けているのと同じコードです。なぜそれが起こっているのですか?あなたが代わりに参照することによって反復、ローカルコピーを並べ替える

#include<iostream> 
#include<vector> 
#include "word.h" 
using namespace std; 

class Line { 
public: 
    vector<Word> words; 
    Line(string&, string&); 
    void quicksort(int, int); 
private: 
    int partition(int, int); 
    void swap(int, int); 
}; 

Line::Line(string& _words, string& orders) { 
    // Reading words and orders, it works well. 
} 

void Line::quicksort(int p, int r) { 
    if (p < r) { 
     int q = partition(p, r); 
     quicksort(p, q - 1); 
     quicksort(q + 1, r); 
    } 
} 

int Line::partition(int p, int r) { 
    int random = rand() % (r - p + 1) + p; 
    swap(r, random); 
    int x = words[r].order; 
    int i = p - 1; 
    for (int j = p; j < r; j++) 
     if (words[j].order <= x) { 
      i++; 
      swap(i, j); 
     } 
    swap(i + 1, r); 
    return i + 1; 
} 

void Line::swap(int i, int j) { 
    if (i != j) { 
     Word temp = words[j]; 
     words[j] = words[i]; 
     words[i] = temp; 
    } 
} 
+0

私はあなたのコンパイラspesificの拡張子によって何を意味するか、uderstandませんでしたか? Visual Studioを使用しています。 –

+0

rand()で何を使用していますか? –

+0

私は、各反復でピボットをランダムに選択するためにrand()を使用します。 'x'はここでピボットです。 –

答えて

2

ラインクラス

申し訳
srand(255); // Call it only once (probably in main) 
for (Line& l : lines) { 
    l.quicksort(0, l.words.size() - 1); 
    for (const Word& w : l.words) 
     std::cout << w.content << " "; 
    std::cout << std::endl; 
} 
// Second loop 
for (const Line& l : lines) { 
    for (const Word& w : l.words) 
     std::cout << w.content << " "; 
    std::cout << std::endl; 
} 
関連する問題