Cormen's Algorithm book(CLRS) のクイック ソート アルゴリズムを実装しています。
vector<int> numbers = {5, 6, 3, 4, 1, 2, 7, 13, -6, 0, 3, 1, -2};
My_Quick_Sort(numbers.begin(), numbers.end());
エラーはありませんが、数字を並べ替えることができません。
本にある疑似コードは以下のようなものです。
- クイックソート(A, p, r)
- p < rの場合
- q = パーティション (A、p、r)
- クイックソート(A, p, q-1)
クイックソート(A, q+1, r)
パーティション(A、p、r)
- x = A[r]
- i = p - 1
- j = p から r - 1 の場合
- _ _ _i= i+1;
- _ _ _交換 A[i] と A[j]
- A[i+1] を A[r] と交換する
- i + 1 を返します。
私の実装は次のようなものです。
template<typename T>
void Swap(T a, T b)
{
typedef typename std::iterator_traits<T>::value_type value_type;
value_type temp;
temp = *a;
*a = *b;
*b = temp;
}
template<typename T>
int Partition(T begin, T end)
{
typedef typename std::iterator_traits<T>::value_type value_type;
value_type x;
x = *end;
T i = begin - 1;
T j;
for(j = begin; j != end+1; ++j)
{
if ( x >= *j )
{
i++;
Swap(i, j);
}
Swap(i+1, end);
}
return static_cast<int>(distance(begin, i) + 1);
}
template<typename T>
void Q_Sort(T begin, T end)
{
auto length = end - begin;
if (length < 2) return;
if ( begin != end )
{
auto pivot = Partition(begin, end);
Q_Sort(begin, begin + pivot - 1);
Q_Sort(begin + pivot + 1, end);
}
}
誰かが私のコードについて何か知っていますか? 動作しますが、ソートはしません。たとえば、シャッフルを入力した場合: 13, 0, -6, 6, -2, 5, 4, 3, 1, 1, 3, 2, 7,
出力は My_Quick_Sort のようになります: -6, -2, 0, 6, 13, 0, 5, 1, 1, 4, 2, 3, 7,