私は現在、3つのパーティションのクイックソートを実装しようとしています。以下のコードは正常に動作しますが、十分に十分な時間稼働しません。私はデータ構造、アルゴリズム、そして一般的な "深みのある"プログラミングに新しいので、時間をかけずに動作させるためにそれを試してみるという試みはほとんど無意味です。 (メモリのパフォーマンスは問題ありません)スリーウェイクイックソートでより高いパフォーマンスが必要
私の直感はピボットを変更することですが、3方向のクイックソートではないと心配しています。
#include <iostream>
#include <vector>
#include <cstdlib>
using std::vector;
using std::swap;
int partition3(vector<int> &a, int l, int r) {
int x = a[l];
int j = l;
int k = r;
int i = l+1;
while (i <= k) {
if (a[i] < x) {
swap(a[i],a[j]);
j++;
i++;
}
else if(a[i] > x) {
swap(a[i],a[k]);
k--;
}
else {
i++;
}
}
return j;
}
void randomized_quick_sort(vector<int> &a, int l, int r) {
if (l >= r) {
return;
}
int k = l + rand() % (r - l + 1);
swap(a[l], a[k]);
while (l < r) {
int m = partition3(a, l, r);
if ((m-l) < (r-m)) {
randomized_quick_sort(a, l, m - 1);
l = m + 1;
}
else {
randomized_quick_sort(a, m + 1, r);
r = m - 1;
}
}
}
int main() {
int n;
std::cin >> n;
vector<int> a(n);
for (size_t i = 0; i < a.size(); ++i) {
std::cin >> a[i];
}
randomized_quick_sort(a, 0, a.size() - 1);
for (size_t i = 0; i < a.size(); ++i) {
std::cout << a[i] << ' ';
}
}
'rand()'に時間がかかる可能性があります。ランダムである必要がありますか?より速い乱数生成器を見つけることができますか? – Galik
あなたは何を測定しているかをもっと明白にすることができますか? IOが遅く、ノイズが多いです。 'rand()'は実装依存です。あなたの速度を測定するときにそれらを含まないことを確認してください。 – Sorin
評価システム用です。オンラインでテストするために提出しています。 – Anonymous