我正在尝试在一串字符上实现快速排序。输出应该给我一个字母顺序版本的输入,但是现在它只是给我原始输入。这是尝试在Quicksort上将伪代码从 Intro转换为Algorithm 3rd Edition 的尝试。
非常感谢任何帮助,谢谢!
Here's the pseudo code of quicksort from the book
#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
int partition_str(string A, int start, int finish){
char x = A[finish], temp;
int i = start - 1;
for (int j = start; j <= finish -1; j++){
if (A[j] <= x){
i ++;
temp = A[i]; A[i] = A[j]; A[j] = temp;
}
temp = A[i+1]; A[i+1] = A[finish]; A[finish] = temp;
return i+1;
}
}
string quicksort_char(string A, int start, int finish)
{
if (start < finish)
{
start = partition_str(A, start, finish);
quicksort_char(A, start, finish -1);
quicksort_char(A, start+1, finish);
}
return A;
}
int main(){
string test = "gsgkdsdkjs";
string result = quicksort_char(test, 0, 10);
cout << result << endl;
return 0;
}
答案 0 :(得分:1)
在你链接的pseudocode中,它提到partition()改变了子阵列。这暗示你需要pass by reference, rather than by value。注意我在函数签名中添加的&符号(&amp;)。你的代码是通过值传递的,所以它正在制作输入字符串的副本,而不是在适当的位置改变它。在你的quicksort()函数中,你编写了代码,期望A将被函数改变。
我在这里清理了你的代码,目的是让它更清晰,看起来更像伪代码......
#include <iostream>
#include <string>
using namespace std;
void exchange(char& a, char& b)
{
char value_of_a = a;
char value_of_b = b;
a = value_of_b;
b = value_of_a;
};
int partition(string& A, int p, int r)
{
char x = A[r];
int i = p-1;
for (int j=p; j<=(r-1); ++j)
{
if (A[j] <= x)
{
i++;
exchange(A[i], A[j]);
}
}
exchange(A[i+1], A[r]);
return i+1;
};
void quicksort(string& A, int p, int r)
{
if (p < r)
{
int q = partition(A, p, r);
quicksort(A, p, q-1);
quicksort(A, q+1, r);
}
};
int main()
{
string input = "gsgkdsdkjs";
cout << "input string: " << input << endl;
quicksort(input, 0, input.size());
cout << "sorted string: " << input << endl;
return 0;
}
在您的partition_str()函数中,您通过值传递字符串A,它会复制A而不是使用您传入的相同A.然后执行一些操作并返回一个整数。然后抛弃A的副本,并且永远不会修改您的原始A变量。这意味着如果您希望更改变量A,则必须通过引用传递。
另外,不要被函数参数命名混淆。你的partition_str()函数签名是:
int partition_str(string A, int start, int finish)
“字符串A”被定义为参数这一事实并不意味着它与代码中名为“A”的任何其他变量相关。它只是一种引用传入的特定参数的方式。