我想根据每行第一个元素的值对二维数组进行排序。因此,在数组的第一个位置具有最低值的行应该放在数组的开头。
我在下面使用的代码:
int Array[5][4] = {
{8 ,1 ,1 ,0},
{6 ,0 ,0 ,0},
{7 ,1 ,1 ,1},
{2 ,1 ,1 ,1},
{1 ,1 ,1 ,1} };
void sortArray(int Sort[][4])
{
int k=0,x,temp;
for(int i=0;i<5;i++)
{
for(int j=i+1;j<5;j++)
{
if(Sort[i][k] > Sort[j][k])
{
for(int x=0;x<2;x++)
{
temp=Sort[i][x];
Sort[i][x]=Sort[j][x];
Sort[j][x]=temp;
}
}
}
}
for(int i=0;i<5;i++)
{
for(int j=0;j<4;j++)
printf("%d ", Sort[i][j]);
printf("\n");
}
}
我想要的输出:
1 ,1 ,1 ,1
2 ,1 ,1 ,1
6 ,0 ,0 ,0
7 ,1 ,1 ,1
8 ,1 ,1 ,0
有什么想法吗?
答案 0 :(得分:0)
您可以使用std::vector<std::vectror<int>>
来简化您的生活。
std::vector<std::vector<int>> Array = { {8 ,1 ,1 ,0},
{6 ,0 ,0 ,0},
{7 ,1 ,1 ,1},
{2 ,1 ,1 ,1},
{1 ,1 ,1 ,1} };
然后你可以使用std::sort
和lambda函数对它们进行排序。
std::sort(Array.begin(), Array.end(),
[](std::vector<int> const& lhs, std::vector<int> const& rhs)
{ return lhs[0] < rhs[0] });
如果在编译时已知数组大小,则也可以使用std::array
。
std::vector<std::array<int, 4>> Array = { {8 ,1 ,1 ,0},
{6 ,0 ,0 ,0},
{7 ,1 ,1 ,1},
{2 ,1 ,1 ,1},
{1 ,1 ,1 ,1} };
或
std::array<std::array<int, 4>, 5> Array = { {8 ,1 ,1 ,0},
{6 ,0 ,0 ,0},
{7 ,1 ,1 ,1},
{2 ,1 ,1 ,1},
{1 ,1 ,1 ,1} };
std::sort
可以使用其中任何一个数组。
如果你必须使用2D数组,那么由于无法分配数组,所以它会更复杂。您可以创建一个指向Array
元素的指针数组,使用std::sort
对指针数组进行排序。
int Array[5][4] = {
{8 ,1 ,1 ,0},
{6 ,0 ,0 ,0},
{7 ,1 ,1 ,1},
{2 ,1 ,1 ,1},
{1 ,1 ,1 ,1} };
int* ptrArray[5] = {Array[0], Array[1]. Array[2], Array[3], Array[4]);
std::sort(ptrArray, ptrArray+5,
[](int* lhs, int* rhs)
{ return lhs[0] < rhs[0] });
之后,即使ptrArray
仍然保持原始状态,也可以使用Array
访问已排序的数组。
答案 1 :(得分:0)
你的问题在于:
for(int x=0;x<2;x++)
您只是交换每行的前两个元素,而不是全部四个元素。以下更改应使其按预期工作:
for(int x=0;x<4;x++)