cin字符串到一个向量中,并对它们进行快速排序
cin strings into a vector and quicksort them
编写一个名为string_listrongort((的void函数,该函数从cin读取任意数量的字符串(允许重复(,将它们存储在向量中,然后对它们进行排序这里不要使用标准的C++排序函数——使用您创建的快速排序版本。
我的问题是我试图使用strcmp()
,但我遇到了很多错误,所以我尝试了这种方法,但我对char val = v[end]
有问题。我不知道如何比较两个std::string
值。我将char改为string,它就可以工作了。现在我的问题是,例如v={"苹果"、"汽车"、"狐狸"、"肥皂"、"foz"};我得到的结果是苹果、肥皂、汽车、福克斯、福克斯,它们不是按字母顺序排列的
#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] << " ";
}
}
OP几乎具有排序功能。两个错误特别突出:
char val = v[end];
char temp;
v
是vector<string>
,因此v[end]
将返回string
。
string val = v[end];
string temp;
处理好了这一点,并使程序编译并成功排序。无需进入string
内部逐字符进行比较。string
为您做这项工作。
第二个问题:Quicksort的分区函数应该看起来像
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"};
当它起作用的时候,就会发疯,给它喂一些讨厌的东西。我喜欢彭赞斯海盗乐队的《少将之歌》。
您可以使用std::string::compare()
或关系运算符来比较字符串。看起来您已经尝试过在这里使用关系运算符,但正如@user4581301所指出的,在第一行的partition()
中,您有
char val = v[end];
但是,v[end]
的类型是"string",而不是"char"。如果您将val
和temp
声明为string
而不是char
,那么您可以使用现有的关系运算符对它们进行排序,我认为您会没事的。
compare()
文档:fttp://www.cplusplus.com/reference/string/string/compare/
关系运算符:http://www.cplusplus.com/reference/string/string/operators/
- 计算排序向量的向量中唯一值的计数
- 查找两个排序向量中共有的元素
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何修复我的快速排序实现?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在 MIPS 中快速排序
- 如何从C++的对的排序向量中获取有关给定值的相应对
- 不正确的比较和交换计数器输出用于快速排序功能
- 对象接收堆栈溢出异常 c++ 的排序向量
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- 使用快速排序的数组版本对向量进行排序
- 快速排序函数C++ 1 个参数 - 向量
- C++ 使用向量快速排序
- 为对象向量实现快速排序算法
- 对象的c++快速排序向量
- C++快速排序向量并保留原始索引号
- 当对可被7整除的向量大小进行排序时,是否有什么东西会导致快速排序算法出错
- 如何对字符串向量进行快速排序,我必须对字符串的长度进行排序
- 快速排序应用于指向对象的指针向量-无限循环
- cin字符串到一个向量中,并对它们进行快速排序