将字符串转换为矢量并快速排序

时间:2016-08-08 23:29:35

标签: c++ string quicksort stdvector

  

编写一个名为 string_list_sort()的void函数,它从 cin 中读取任意数量的字符串(允许重复),将它们存储在向量中,然后对它们进行排序。 此处不要使用标准C ++排序功能 - 使用您创建的快速排序版本。

我的问题是我尝试使用char val = v[end]但是我遇到了很多错误,所以我尝试了这种方法,但我遇到了std::string的问题。我不确定如何比较两个#include <iostream> #include <string> #include <cstdio> #include <cstring> #include <vector> #include "error.h" using namespace std; void string_list_sort(vector<string> v){ string line; while (getline(cin, line)){ if (line.empty()){ break; } v.push_back(line); } } int partition(vector<string>&v, int begin, int end) { char val = v[end]; char temp; int j = end; int i = begin - 1; while (true) { while (v[++i] < val) while (v[--j] > val) { if (j == begin) break; } if (i >= j) break; temp = v[i]; v[i] = v[j]; v[j] = temp; } temp = v[i]; v[i] = v[end]; v[end] = temp; return i; } void quicksort(vector<string>& v, int begin, int end) { if (begin < end) { int p = partition(v, begin, end); quicksort(v, begin, p - 1); quicksort(v, p + 1, end); } } void quick_sort(vector<string>& v) { quicksort(v, 0, v.size() - 1); } int main() { vector<string> v; v = { " this is a test string,.,!"}; string word; while (cin >> word) { v.push_back(word); } quick_sort(v); for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; } } 值。 我将char更改为字符串并且它有效。现在我的问题是例如v = {&#34; apple&#34;,&#34; car&#34;,&#34; fox&#34;,&#34; soap&#34;,&#34; foz&#34;};我得到的结果是苹果,肥皂,汽车,狐狸,foz,这不是按字母顺序排列

{{1}}

2 个答案:

答案 0 :(得分:0)

您可以使用std::string::compare()或关系运算符来比较字符串。 您似乎已尝试在此处使用关系运算符,但正如@ user4581301指出的那样,在第一行的partition()中,您有

char val = v[end];

但是,v[end]的类型为&#39; string&#39;,而不是&#39; char&#39;。如果您将valtemp声明为string而不是char,则可以使用您拥有的关系运算符对它们进行排序,我认为您会没事的。

compare()文档:fcp://www.cplusplus.com/reference/string/string/compare/

关系运算符:http://www.cplusplus.com/reference/string/string/operators/

答案 1 :(得分:0)

OP几乎有一个排序功能。两个错误特别突出:

char val = v[end];
char temp;

vvector<string>,因此v[end]将返回string

string val = v[end];
string temp;

完成这项工作并使程序编译并成功排序。没有必要进入string来逐个字符地进行比较。 string这对您有用。

第二个问题:Quicksort的分区函数应该看起来像(Looting from wikipedia here

algorithm partition(A, lo, hi) is
    pivot := A[lo]
    i := lo – 1
    j := hi + 1
    loop forever
        do
            i := i + 1
        while A[i] < pivot

        do
            j := j – 1
        while A[j] > pivot

        if i >= j then
            return j

        swap A[i] with A[j]

并且OP的分区功能已经获得了一大堆额外的行李,需要将其移除以获得教师的最佳标记。看一下上面的伪实现,并与你的实现进行比较。您可能会以正确的方式看到错误,但如果没有,请站在巨人的肩膀上并将其转换为C ++(提示::=在C ++中是普通的=,您需要添加一些;和大括号)。根据需要调试结果。我不会翻译它,因为这几乎完全打败了作业的重点。

附注(收集一些重要评论):

编写测试驱动程序时,在知道算法有效之前不要接受用户输入。从预加载的输入开始,易于可视化,如

int main()
{
    vector<string> v{"C","B","A"};
    quick_sort(v);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";

    }
}

当输出为“A B C”时,将输入更改为更复杂但仍易于可视化的内容

vector<string> v{"A","C","Q","B","A"};

当这项工作变得疯狂并为它提供令人讨厌的东西时。我喜欢彭赞斯海盗的Major General's Song