C++ 二维数组排序
在我看到的二维数组排序中,他们只是将其复制到一维数组并进行排序。但是有没有其他方法可以在不使用一维数组的情况下对二维数组进行排序呢 //代码C++ 二维数组排序,c++,C++,在我看到的二维数组排序中,他们只是将其复制到一维数组并进行排序。但是有没有其他方法可以在不使用一维数组的情况下对二维数组进行排序呢 //代码 #include<iostream> #include<conio.h> using namespace std; int main() { int rows, columns; int k = 0, temp; int rowColumn; //getting rows and columns number cout<
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int rows, columns;
int k = 0, temp;
int rowColumn;
//getting rows and columns number
cout<<"Enter number of rows";
cin>>rows;
cout<<"Enter number of columns";
cin>>columns;
//declaring and intitalizing oneD and twoD array
rowColumn = rows * columns;
int arr[rows][columns];
int oneDArr[rowColumn];
//Fill 2D array by user
cout<<"Fill 2D array row wise"<<endl;
for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
{
cin>>arr[i][j];
}
}
//Taking 2d array in 1d array
for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
{
oneDArr[k] = arr[i][j];
k++;
}
}
//Bubble sort perform on 1d array
for(int j=1;j<rowColumn;j++)
{
for(int i=0; i<rowColumn; i++)
{
if(oneDArr[i]>oneDArr[i+1])
{
temp=oneDArr[i];
oneDArr[i] = oneDArr[i+1];
oneDArr[i+1]=temp;
}
}
}
//rearranging the oneD array to twoD array
k = 0;
for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
{
arr[i][j] = oneDArr[k];
k++;
}
}
//Displaying sorted 2d Array
for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
{
cout<<arr[i][j]<<"\t";
}
cout<<"\n";
}
}
#包括
#包括
使用名称空间std;
int main()
{
int行、列;
int k=0,温度;
内行列;
//获取行数和列数
库特罗斯;
coutcolumns;
//声明和初始化oneD和twoD数组
rowColumn=行*列;
int arr[行][列];
int oneDArr[行列];
//按用户填充二维数组
cout如果要将二维数组排序为一维数组(先解释行或先解释列),则无需首先将其物理复制到一维数组
您可以始终假设您已经有一个虚构的一维数组,其索引i
通过以下公式映射到原始二维数组的索引
i_row = i / columns;
i_column = i % columns;
现在,您只需在1D索引上使用任何1D排序算法,每次需要访问虚拟1D数组的元素i
,只需计算i_行
和i_列
,然后访问相应的2D元素即可
这将实现与原始代码中完全相同的功能,但没有物理1D数组,也没有在1D和2D数组之间来回复制数据。您可以使用某种机制将2D数组视为1D数组,这将节省额外的空间。
如果您有一个整数p
,则可以按如下方式提取行号
和列号
rownumber=p/columnsize;
columnnumber=p%columnsize;
下面是使用上述方法实现冒泡排序
#include <iostream>
using namespace std;
#define colsize 3
#define rowsize 2
int main()
{
int arr[rowsize][colsize]={{7,8,9},{3,2,1}};
int r,c,r2,c2;
int n=rowsize*colsize;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i-1;j++)
{
r=j/colsize;
c=j%colsize;
r2=(j+1)/colsize;
c2=(j+1)%colsize;
if(arr[r][c]>arr[r2][c2])
{
swap(arr[r][c],arr[r2][c2]);
}
}
}
for(int i=0;i<rowsize;i++)
{
for(int j=0;j<colsize;j++)
{
cout<<arr[i][j]<<" ";
}
}
return 0;
}
#包括
使用名称空间std;
#定义colsize 3
#定义行大小2
int main()
{
int arr[rowsize][colsize]={{7,8,9},{3,2,1};
int r,c,r2,c2;
int n=行大小*列大小;
对于(int i=0;iYou可以设置一种访问2D数组的方法,以便1D算法可以无缝地对其进行处理。通常,您可以使用许多排序算法中的任何一种,这些算法改进了bubble sort。可能与@Politank-Z重复-如果您保证数组的存储是连续的,那么这将相对简单。首先,您必须解释你所说的“二维数组排序”是什么意思。对这种排序有许多完全不同的理解。当不清楚您要做什么时,讨论如何做是没有意义的。@Mr.Llama即使您没有这样的保证,并且您知道数组的宽度,您仍然处于微不足道的距离。是的,这不是必需的。