C++ 哪种方法是对二维数组进行排序的最佳方法?
二维数组排序的最快方法是什么? 我用C++语言创建一个应用程序,我有一个二维字符串数组来存储状态名和城市名称。我想对该数组进行排序,并将其快速显示为列表。所以,它必须更快 声明如下C++ 哪种方法是对二维数组进行排序的最佳方法?,c++,arrays,sorting,C++,Arrays,Sorting,二维数组排序的最快方法是什么? 我用C++语言创建一个应用程序,我有一个二维字符串数组来存储状态名和城市名称。我想对该数组进行排序,并将其快速显示为列表。所以,它必须更快 声明如下 std::string state[STATE_SIZE] std::string city[STATE_SIZE][CITY_SIZE] 结果应该是这样的 state[0] = "AAA"; state[1] = "BBB"; city[0][0] = "ABC"; city[0][1] = "PQR"; ci
std::string state[STATE_SIZE]
std::string city[STATE_SIZE][CITY_SIZE]
结果应该是这样的
state[0] = "AAA";
state[1] = "BBB";
city[0][0] = "ABC";
city[0][1] = "PQR";
city[0][2] = "XYZ";
city[1][0] = "ADC";
city[1][1] = "GSF";
city[1][2] = "UHA";
城市数组应按州然后按城市排序
我也读过这些帖子。但它只适用于一维数组
解决您的问题(特别是30000多条记录)的最佳方法是实现AVL树(一种自平衡二进制文件)。我建议你在维基百科或其他网站上读一些关于它们如何工作的文章(特别是AVL树)。为了让您了解如何实现,我进行了一次随机谷歌搜索:以下内容可能会有所帮助:
intmain(intargc,char*argv[])
{
constexpr int STATE_SIZE=2;
城市内部的constexpr_SIZE=3;
std::字符串数据[州大小][城市大小]=
{
{“ABC”、“XYZ”、“PQR”},
{“UHA”、“ADC”、“GSF”}
};
字符串状态[状态大小]={“AAA”,“BBB”};
对于(int i=0;i!=状态_SIZE;++i){
标准::排序(数据[i],数据[i]+城市大小);
}
对于(int i=0;i!=状态_SIZE;++i){
std::您想按城市还是按州对其进行排序?您使用的是什么数据结构,它们是如何链接的。您能为您现有的结构添加一个代码示例吗?性能真的是一个问题吗?例如,它是您应用程序中的瓶颈吗?@MatthiasBonoraString data[州,市]
我想先按州再按城市排序。啊,我很抱歉。我在网站上找到了一个主题,它有一个很好的排序技巧,叫做std::sort
(通过algorithm.h
)。您可以使用二叉树对其进行排序,这取决于数据的大小。这可能是正确的选择。如果它非常小,那么实现一些可怕的算法就没有意义了,您可以通过比较第一行和第二行来“正常排序”。因此,您有类似于std::string data[STATE_size/*2*/][CITY_SIZE/*3*/]={{“ABC”、“PQR”、“XYZ”}、{“ADC”、“GSF”、“UHA”};
?实际上,你想对每行进行排序吗?他提到他计划对30000多行进行排序,std::sort不会太慢吗?@Thebaconning:据我所知,OP只会排序一次。因此,它将是O(n logn)
(作为AVL树,但更便于缓存)。
int main(int argc, char *argv[])
{
constexpr int STATE_SIZE = 2;
constexpr int CITY_SIZE = 3;
std::string data[STATE_SIZE][CITY_SIZE] =
{
{"ABC", "XYZ", "PQR"},
{"UHA", "ADC", "GSF"}
};
std::string states[STATE_SIZE] = {"AAA", "BBB"};
for (int i = 0; i != STATE_SIZE; ++i) {
std::sort(data[i], data[i] + CITY_SIZE);
}
for (int i = 0; i != STATE_SIZE; ++i) {
std::cout << states[i] << std::endl;
for (int j = 0; j != CITY_SIZE; ++j) {
std::cout << " " << data[i][j] << std::endl;
}
}
return 0;
}