【发布时间】:2013-08-10 09:57:03
【问题描述】:
我正在实现 Cormen 算法书 (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
- 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[j] 交换 A[i]
- 用 A[r] 交换 A[i+1]
- 返回 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,
【问题讨论】:
-
嗨。要求人们发现代码中的错误并不是特别有效。您应该使用调试器(或添加打印语句)来隔离问题,方法是跟踪程序的进度,并将其与您期望发生的情况进行比较。一旦两者发生分歧,那么您就发现了您的问题。
-
为什么不使用
std::qsort()? -
我想练习实现递归和迭代器,这就是我不使用qsort的原因。问题是我没有收到任何错误消息,所以很难发现我错过了什么。
-
Q_Sort(begin, begin + pivot - 1);和Q_Sort(begin + pivot + 1, end);-begin + pivot什么时候排序? -
没有错误,但是无法对数字进行排序 LOL
标签: c++ algorithm sorting iterator quicksort