【问题标题】:Sorting 2D array对二维数组进行排序
【发布时间】:2015-09-17 15:03:40
【问题描述】:

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

// 代码

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

有没有其他方法可以有效地对二维数组进行排序。

【问题讨论】:

  • 您可以设置访问二维数组的方法,以便一维算法可以无缝地对其进行处理。大多数情况下,您可以使用改进冒泡排序的众多排序算法中的任何一种。
  • C Array sorting tips 的可能重复项
  • @Politank-Z - 如果你保证阵列的存储是连续的,那将是相对微不足道的。
  • 首先,您必须解释“二维数组的排序”是什么意思。对于这样的排序,有很多完全不同的理解。当你不清楚什么你想做什么时,讨论如何做某事是没有意义的。
  • @Mr.Llama 即使你不能保证,而且你知道数组的宽度,你仍然在微不足道的距离。

标签: c++


【解决方案1】:

您可以使用某种机制将二维数组视为一维数组,这将为您节省额外的空间。 如果你有一个整数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;
   }

【讨论】:

  • 是的,这不是必需的。
【解决方案2】:

如果您想对二维数组进行排序,就好像它是一维数组(解释为行优先或列优先),则实际上不需要先将其物理复制到一维数组。

你总是可以假装你已经有一个虚构的一维数组,其索引i通过以下公式映射到原始二维数组的索引

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

现在您可以简单地对一维索引使用任何一维排序算法,并且每次需要访问假想一维数组的元素 i 时,您只需计算 i_rowi_column 并访问相应的二维元素.

这将实现与您在原始代码中完全相同的东西,但没有物理一维数组,也不需要在一维和二维数组之间来回复制数据。

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多