对2D数组进行排序

时间:2015-06-30 17:31:48

标签: c++

在2D数组排序中,我看到他们只是将其复制到单维数组并对其进行排序。但是有没有其他方法可以在不使用一维数组的情况下对二维数组进行排序。

//代码

#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";
} 
} 

是否有其他方法可以有效地对2D数组进行排序。

2 个答案:

答案 0 :(得分:0)

如果要对2D数组进行排序,就好像它是一维数组(先解释为行首或列优先),那么首先不需要将它物理复制到一维数组。

您总是可以假装已经有一个假想的1D数组,其索引i通过以下公式映射到原始2D数组的索引

i_row = i / columns;
i_column = i % columns;

现在您可以在1D索引上使用任何1D排序算法,并且每次需要访问虚拟1D数组的元素i时,只需计算i_rowi_column和改为访问相应的2D元素。

这将实现与原始代码完全相同的功能,但没有物理1D阵列,也无需在1D和2D阵列之间来回复制数据。

答案 1 :(得分:0)

您可以使用某种机制将二维数组视为一维数组,这样可以节省额外的空间。 如果您有一个整数p,则可以按如下方式提取row numbercolumn number

 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;
   }