QuickSort中使用的Hoare分区代码(Ref Cormen Book)陷入无限循环
Hoare partitioning code used in Quicksort (ref Cormen book) runs into infinite loop
i代码QuickSort使用Cormen算法书籍中的Hoare分区。我无法发现代码中的任何错误,看起来就像书中的伪代码。
swapping i, j : 0, 8
-2 2 -5 -3 6 0 1 0 -1 4
swapping i, j : 1, 3
-2 -3 -5 2 6 0 1 0 -1 4
p is: 2
swapping i, j : 0, 1
-3 -2 -5 2 6 0 1 0 -1 4
p is: 0
完成了上述交换后,该代码最终最终在子阵列{-3, -2}
上进行了分区。对于此subarray
,枢轴为-3
,将partition() returns 0
作为index (j)
。由于此子阵列已经用0th index
位置的枢轴-3
对此进行了排序,因此每次速写时都不会进行更改。因此,Qsort循环永远。
有人可以告诉我,这与书中的hoare分区有何不同,如果同样的话为什么不起作用?
void swap(int *a, int i, int j) {
cout << "swapping i, j : " << i << ", " << j << endl;
int tmp = a[i];
a[i] = a[j];
a[j] = tmp; }
int partition(int *a, int len) {
int pivot = a[0];
int i = -1, j = len;
while (true) {
while ( ++i && a[i] < pivot && i< j) {}
while (--j && a[j] > pivot && i <j) {}
if (i < j )
swap(a, i, j);
else
return j ;
} }
void qsort(int a[], int len) {
int p = partition(a, len);
cout << "p is: " << p << endl;
qsort(a, p);
qsort(a+p, len - p ); }
int main(int argc, char *argv[]) {
int a[10] = {-1, 2, -5, -3, 6, 0, 1, 0, -2, 4};
qsort(a, 10); }
在答案中扩展我的评论, partition()
返回基于0的index ,但是您需要传递数组长度(长度为基于1的(到qsort()
,因此必须是:
void qsort(int a[], int len)
{
int p = partition(a, len);
cout << "p is: " << p << endl;
qsort(a, p + 1); // note p+1 instead of p
qsort(a + p + 1, len - (p + 1)); // note p+1 instead of p
}
干式运行看起来像:
swapping i, j : 0, 8
-2 2 -5 -3 6 0 1 0 -1 4
swapping i, j : 1, 3
-2 -3 -5 2 6 0 1 0 -1 4
p is: 2
现在您必须调用qsort(a, 3)
,因为您要对子阵列-2 -3 -5
进行排序。另外,子阵列2 6 0 1 0 -1 4
相关文章:
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- Bjarne Stroustrup Book - Vector and For loop - 将不起作用
- QuickSort中使用的Hoare分区代码(Ref Cormen Book)陷入无限循环
- 需要使用 Book* 头变量重载运算符,但不起作用
- Having trouble with bool Book::isEmpty() const
- 将 std::find 与自定义 Book 类一起使用
- 通过C++和Qt访问Googles Book API
- 来自Cormen的霍夫曼算法
- 使用析构函数后,代码显示"reference to Book::~Book()"错误
- C++ by example book
- 调用'Book::Book()'没有匹配函数
- 从T Cormen书插入排序
- 将值从一个向量复制到另一个向量(从book)
- "Exploring C++ book"编译器设置
- Stroustrup PPP Book第12章:无法转换'& # 39; Graph_lib::点# 39;
- Stroustrup c++ Book.如何跟踪在while循环中哪个整数输入是最小和最大的
- xmpp向face book聊天api进行身份验证,并且总是收到失败消息
- 没有匹配函数来调用类型 'hash<char">' 的对象(Stroustrup Book Drill)