重新排列二维数组

Re arranging a 2D array

本文关键字:二维数组 排列 新排列      更新时间:2023-10-16

我正在尝试用c++做一些DNA分析。我有一个包含DNA序列的二维字符数组。char input[n][m];

现在根据DNA模式,我对输入数组进行一些处理,并为该模式找到一个新的序列。

假设原始序列是1,2,3,4,5,6。这是6个DNA(二维数组的行)

处理后我得到订单为1,6,2,4,3,5。那么我如何按照这个顺序重新排列原始输入数组呢?也就是说,输入的第一行现在应该是第一个DNA,第二行现在应该是原始阵列中的第六个DNA,以此类推。

 int main()
{
using namespace std;
char input[t][l] = {    {'A','A','A','T','C','A','G','T','A'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'}

                 };
// SOME PROCESSING
Here output array has the elements ={1,6,2,4,3,5}
  for (int i = 0; i<t; i++)
  {
  cout << output[i] << " ";
  }  
}

任何想法如何改变内存中的地址,以便重新排序原始数组?

这只会移动指针:

char input[5][9] = {    {'A','A','A','T','C','A','G','T','A'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'},
                        {'A','T','T','A','C','T','G','C','A'},
                        {'A','G','C','T','A','C','T','G','C'}
                 };
char* output[5];
output[0] = input[3];
output[1] = input[2];
output[2] = input[4];
char test = output[1][3];

如果您不需要就地执行,只需创建新的目标矩阵,将第1行复制到第1行,将第6行复制到第2行,以此类推…只使用输出[i]作为原始矩阵行索引。

有了更多的簿记,它当然也可以在适当的地方完成。好吧,如果你需要就地取材,我会这样做:您有[源行][目标行]的配对列表,如:

[1] & lt; [1],[2] & lt; [6],[3] & lt; [2],…

创建描述复制操作的映射。那就从1开始。

[1]<-[1]很容易。(你可以把它从地图上删除)

[2]<-[6]覆盖原来的第2行,这是下一步需要的。交换第2行和第6行。现在,第6行是正确的位置,但是您需要更改映射。您需要将mapping [3]<-[2]更改为[3]<-[6],使用类似于map[2]=6.

直到完成

我个人会使用vector<string> input

vector<double> output_list (t,0); // length t, initialized to 0
// assign the values of output_list
for (int i = 0; i<t; i++)
{
cout << input[output_list[i]] << " ";
}

请注意,此解决方案不需要额外的内存(没有第二个2D数组)也不需要额外的计算时间(您不交换数据,您只需调用您需要的部分)

如果你绝对需要重新排序数组(正如我在你的评论中注意到的),你可以根据需要多次swap(input[i],input[j])