我正在实现 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]
- 我 = p - 1
- 对于 j = p 到 r - 1
- _ _ _i= i+1;
- _ _ _用 A[j] 交换 A[i]
- 将 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);
}
}
有人对我的代码有任何想法吗?它有效,但不进行排序。例如,如果我输入 shuffle: 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,