在字符串上实现快速排序

时间:2016-10-26 16:07:29

标签: c++ quicksort

我正在尝试在一串字符上实现快速排序。输出应该给我一个字母顺序版本的输入,但是现在它只是给我原始输入。这是尝试在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;
}

1 个答案:

答案 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”的任何其他变量相关。它只是一种引用传入的特定参数的方式。