编写一个名为 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}}
答案 0 :(得分:0)
您可以使用std::string::compare()
或关系运算符来比较字符串。
您似乎已尝试在此处使用关系运算符,但正如@ user4581301指出的那样,在第一行的partition()
中,您有
char val = v[end];
但是,v[end]
的类型为&#39; string&#39;,而不是&#39; char&#39;。如果您将val
和temp
声明为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;
v
是vector<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。