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;
}
}
私はあなたのコンパイラspesificの拡張子によって何を意味するか、uderstandませんでしたか? Visual Studioを使用しています。 –
rand()で何を使用していますか? –
私は、各反復でピボットをランダムに選択するためにrand()を使用します。 'x'はここでピボットです。 –