实施快速排序的问题

时间:2009-07-15 19:04:08

标签: c++ quicksort

我正在尝试实施快速排序并遇到麻烦。最终,排序将按字母顺序排列一个字符串向量,然后将第二个向量与它同步,使它们保持匹配(这应该很容易,因为它只是用不同的向量参数重复相同的行。)

首先,当我编译并运行程序时,它只是生成与以前相同的输出。我意识到这是因为当我宣布向量时我没有使用object.member符号。我修改了它,现在我收到编译错误。

in function int main
in lookup_member, at cp/search.c:1288

显然,当它试图查看向量时会出现问题,但我不确定是什么。

我从 Quick Sort (MathBits.com)获得了快速排序代码的实现。

我不确定是什么问题。这是代码。

#include "std_lib_facilities.h"

struct Name_pairs
{
    vector<string>names;
    vector<double>ages;
    void quicksort(vector<string>& num, int top, int bottom);
    void divide(vector<string>& array, int top, int bottom);
    bool test();
    string read_names();
    double read_ages();
    void print();
};

string Name_pairs::read_names()
{
    string name;
    cout << "Enter name: ";
    cin >> name;
    names.push_back(name);
    return name;
}

double Name_pairs::read_ages()
{
    double age;
    cout << "Enter corresponding age: ";
    cin >> age;
    ages.push_back(age);
    cout << endl;
    return age;
}

int Name_pairs::divide(vector<string>& array, int top, int bottom)
{
    string x = array[top];
    int i = top-1;
    int j = bottom-1;
    string temp;
    do{
        do
        {
            j--;
        } while(x>array[j]);

        do
        {
            i++;
        } while(x<array[i]);

        if(i<j)
        {
            temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    } while(i<j);
    return j;
}


void Name_pairs::quicksort(vector<string>& num, int top, int bottom) // top is subscript of beginning of vector.
{
    int middle;
    if(top < bottom)
    {
        middle = divide(num, top, bottom);
        quicksort(num, top, middle);
        quicksort(num, middle+1, bottom);
    }
    return;
}

void Name_pairs::print()
{
     for(int i = 0; i < (names.size()-1) && i < (ages.size()-1); ++i)
         cout << names[i] << " , " << ages[i] << endl;
}

int main()
{
    Name_pairs np;
    vector<string>names;
    vector<double>ages;
    cout << "Enter names and ages. Use 0 to cancel.\n";
    bool finished = false;
    while(!finished){
        finished = "0" == np.read_names();
        finished = 0 == np.read_ages();
    }
    np.quicksort(names, 0, (names.size()-2));
    np.print();
    keep_window_open();
}

5 个答案:

答案 0 :(得分:2)

如果您尝试在main中定义其他矢量变量,则行

np.vector<string>names; // error possibly here?
np.vector<double>ages;

应该是:

vector<string> names;
vector<double> ages;

您正在重新定义您的结构成员,或者看起来如此。但是我没看到你实际使用它们的位置。此外,size()返回某种类型的无符号变量,因此您可能需要对其进行强制转换,或者更改比较它的方式以防止编译器错误/警告。

值得注意的是,如果你想在main()中声明更多的向量,那么最好将它们命名为独特的,而不是让它们与struct成员共享名称。另外,你的main()没有返回(需要返回int)。

答案 1 :(得分:2)

删除main()中显然导致编译器崩溃的以下行:

np.vector<string>names; // error possibly here?    
np.vector<double>ages;

然后,您的一些函数定义需要更改其签名:

int divide(vector<string>& array, int top, int bottom)

void quicksort(vector<string>& num, int top, int bottom) 

需要改为

int Name_pairs::divide(vector<string>& array, int top, int bottom)

void Name_pairs::quicksort(vector<string>& num, int top, int bottom) 

因此它们被视为Name_pairs结构的一部分,而不是自由函数。

答案 2 :(得分:2)

我得到了它的工作。最终代码:推送数据并同步排序,

#include "std_lib_facilities.h"

struct Name_pairs
{
    vector<string>names;
    vector<double>ages;
    void quicksort(vector<string>& num, vector<double>& num2, int top, int bottom);
    int divide(vector<string>& array, vector<double>& array2, int top, int bottom);
    bool test();
    string read_names();
    double read_ages();
    void print();
};

string Name_pairs::read_names()
{
    string name;
    cout << "Enter name: ";
    cin >> name;
    names.push_back(name);
    return name;
}

double Name_pairs::read_ages()
{
    double age;
    cout << "Enter corresponding age: ";
    cin >> age;
    ages.push_back(age);
    cout << endl;
    return age;
}

int Name_pairs::divide(vector<string>& array, vector<double>& array2, int top, int bottom)
{
    string x = array[top];
    int i = top-1;
    int j = bottom+1;
    string temp;
    double temp2;
    do{
        do
        {
            j--;
        } while(x<array[j]);

        do
        {
            i++;
        } while(x>array[i]);

        if(i<j)
        {
            temp = array[i];
            temp2 = array2[i];
            array[i] = array[j];
            array2[i] = array2[j];
            array[j] = temp;
            array2[j] = temp2;
        }
    } while(i<j);
    return j;
}

void Name_pairs::quicksort(vector<string>& num, vector<double>& num2, int top, int bottom)
{
    int middle;
    if(top < bottom)
    {
        middle = divide(num, num2, top, bottom);
        quicksort(num, num2, top, middle);
        quicksort(num, num2, middle+1, bottom);
    }
    return;
}

void Name_pairs::print()
{
     for (int i = 0; i < (names.size()-1) && i < (ages.size()-1); ++i)
         cout << names[i] << " , " << ages[i] << endl;
}

int main(){
    Name_pairs np;
    cout << "Enter names and ages. Use 0 to cancel.\n";
    bool finished = false;
    while(!finished){
    finished = "0" == np.read_names();
    finished = 0 == np.read_ages();}
    np.quicksort(np.names, np.ages, 0, (np.names.size()-2));
    np.print();
    keep_window_open();
}

(这是在OP的编辑(原始问题)中作为答案列出的。它本应作为答案发布,我在此处重新发布。)

答案 3 :(得分:0)

应删除main()中的以下行:

np.vector<string>names; // error possibly here?    
np.vector<double>ages;

它们已作为实例化Name_pairs的一部分而存在。

此外,从quicksort中删除参数名称,因为它不是必需的,并且会使您的代码无法按照您认为的方式运行。您要排序的名称是Name_pairs的成员。您在main()中声明的那些不是您使用read_names()读到的那些。

编辑:实际上,如果您使用包含年龄和名称的结构声明单个向量并对该数组进行排序,则可能更容易。整个程序意味着您要对名称进行排序,然后打印出具有相关年龄的每个名称,但您只对名称数组进行排序。

EDIT2:从其他答案来看,我认为在完全解决这个问题之前,你需要了解更多关于如何声明成员函数的信息。

答案 4 :(得分:0)

如果您不介意使用额外的内存但速度稍高,则可以使用结构或对,因为int是您在排序之前设置的第二个向量中的索引。

或者,如果您实际上不需要向量运算符[],并且可以迭代元素,则可以使用映射。