cin字符串到一个向量中,并对它们进行快速排序

cin strings into a vector and quicksort them

本文关键字:快速排序 向量 字符串 一个 cin      更新时间:2023-10-16

编写一个名为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;

vvector<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"。如果您将valtemp声明为string而不是char,那么您可以使用现有的关系运算符对它们进行排序,我认为您会没事的。

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

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