【问题标题】:Sorting a two-dimensional array of characters? C++对二维字符数组进行排序? C++
【发布时间】:2013-02-08 11:46:58
【问题描述】:

我正在尝试对一个 10X15 的字符数组进行排序,其中每一行都是一个单词。我的目标是按降序对它进行排序,从顶部的最大值单词到数组 [第 0 行] [第 0 列到第 14 列] 位置,以及底部数组 [第 9 行] [第 0 列的最小值通过 14]。每一行都是一个单词(是的,它们看起来不像是单词,但这是为了测试程序的排序能力)。

澄清一下:我需要做的是......考虑到每一行都是一个完整的单词,我需要从顶部的最高值单词开始对行进行排序,并且最低值的词在底部。

编辑:

现在一切正常。对于任何有类似问题的人,请查看下面的 cmets,有几个很棒的解决方案,我只是选择了一个我创建自己的排序函数来了解更多关于排序的方法。并感谢大家帮助我! :)

【问题讨论】:

  • 您对问题的描述似乎自相矛盾。我不清楚您是否要对单个行、第一个字母、两者或所有字母进行排序,混合来自不同“单词”的字母。
  • 将每一行转换为字符串,将字符串添加到向量中,添加完所有字符串后,对向量进行排序,然后将字符串写回数组。
  • @us2012 我需要对单词进行排序,每一行都是一个单词。但是有些词几乎相同,直到它们中的最后一个字母。所以显然每个字母(也称为列)都必须进行比较。
  • 您是在编写自己的排序算法还是可以使用std::sort? “最高价值”和“最低价值”是什么意思?你是按字典顺序排序的吗?
  • 如果我自己创建会更好。但归根结底,它甚至可以让它发挥作用。

标签: c++ arrays sorting


【解决方案1】:

你正在使用 c++,所以退出使用数组并从 stl 类型开始:

将每一行转换为字符串:

string tempString
for (int i = 0; i < rowSize; ++i) {
    tempString.pushBack(array[foreachrow][i])
}

将它们添加到向量中

std::vector<std::string> sorter;
sorter.push_back(tempString);

对每一行都这样做。

std::vector<std::string> sorter;
for each row {
    for each coloumn {
        the string thing

    }
    push back the string
}

然后使用std::sort 对向量进行排序并将向量写回数组(如果必须这样做但不要因为数组很烂)

【讨论】:

  • 是的.......问题需要我使用 10x15 的字符数组。所以不喜欢这是我的选择。现在查看您的解决方案。 :)
  • 您不允许导入 std::libs 吗?因为您可以使用 stl 容器然后输出为数组。
  • 我可以为所欲为。但是对于初级 C++ 类来说,它必须足够简单。唯一的要求是我有一个 10x15 的字符数组,其中每一行都是一个单词;我必须有一个排序功能和一个打印功能。而已。另外,它告诉我字符串没有 .pushBack...
  • @Noobacode 这显然是伪代码。我不会为你写作业。您将需要找出使 for 循环执行您想要的操作的方法。是的,它是 push_back()。
  • @Noobacode 您不必编写自己的排序函数:cplusplus.com/reference/algorithm/sort std::sort 会为您完成。
【解决方案2】:

像往常一样,你需要qsort:

void qsort( const void *ptr, size_t count, size_t size,
            int (*comp)(const void *, const void *) );

这需要一个指向您的起始地址的 void 指针、要排序的元素数量、每个元素的大小以及一个比较函数。

你可以这样称呼它:

qsort( array, ROWS, COLS, compare_word );

你定义 compare_word 反向排序的地方:

int compare_word( const void* a, const void* b )
{
    return strncmp( b, a, COLS );
}

现在,鉴于每个单词的长度为 15 个字符,因此可能需要处理填充。我不知道数组将被打包为 10 x 15 而不是 10 x 16。但如果您怀疑是这样,您可以将 (&amp;array[1][0] - &amp;array[0][0]) 作为元素大小而不是 COLS 传递。

如果您不允许使用qsort 而必须编写自己的排序算法,请执行一些简单的操作,例如选择排序。您可以使用strncmp 来测试字符串。查找函数(谷歌很容易,或者如果你使用 Linux,man 3 strncmp)。要交换字符,您可以使用长度为 COLS 的临时数组 char,然后调用 3 次 memcpy 来交换单词。

【讨论】:

  • 我现在正在尝试使用冒泡排序对我的向量值使用 string.compare,但效果不佳(请参阅原始帖子)。
【解决方案3】:

使用stringvector 的新代码的问题是一个简单的错字:

sorter[count] = array[count+1]; 应该是sorter[count] = sorter[count+1];

【讨论】:

  • 关于为什么我的向量到数组的转换在 convArray() 中不起作用的任何想法?
  • @Noobacode 与另一个相同的错字,只是反过来 - sorter[row][col]=tempString[col]; 应该是 array[row][col]=tempString[col];
  • Duh... 哦,天哪,我想这就是整天坐在电脑前对你的影响。非常感谢楼主!
猜你喜欢
  • 2011-02-17
  • 2021-08-16
  • 2014-08-10
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
相关资源
最近更新 更多