C# 使用插入排序-C按id对二维字符串数组排序#
我是新来的,如果我的问题很愚蠢,我很抱歉,但我真的需要你的帮助。 我需要按id(第一列)对二维字符串数组进行排序: 问题是我只对数字进行排序,我想在它们之后对单词进行排序。到目前为止我就是这么做的C# 使用插入排序-C按id对二维字符串数组排序#,c#,arrays,sorting,C#,Arrays,Sorting,我是新来的,如果我的问题很愚蠢,我很抱歉,但我真的需要你的帮助。 我需要按id(第一列)对二维字符串数组进行排序: 问题是我只对数字进行排序,我想在它们之后对单词进行排序。到目前为止我就是这么做的 static void Main(string[] args) { string [,] a = new string [,] { {"2","Pena","pena"}, {"1","Kon","kon"}, {"5","Sopol",
static void Main(string[] args)
{
string [,] a = new string [,]
{
{"2","Pena","pena"},
{"1","Kon","kon"},
{"5","Sopol","sopol"},
{"4","Pastet","pastet"},
{"7","Kuche","kuche"}
};
int b = a.GetLength(0);
Console.WriteLine(b);
Console.WriteLine(a[0,0]);
Console.WriteLine(a[0,1]);
Console.WriteLine(a[1,0]);
InsertionSort(a, b);
Console.WriteLine();
Console.Write("Sorted Array: ");
printArray(a);
Console.WriteLine();
Console.Write("Press any key to close");
Console.ReadKey();
}
public static void InsertionSort(string[,] iNumbers, int iArraySize)
{
int i, j, index;
for (i = 1; i < iArraySize; i++)
{
for (int k = 0; k < iNumbers.GetLength(1); k++)
{
index = Convert.ToInt32(iNumbers[i, 0]);
j = i;
while ((j > 0) && (Convert.ToInt32(iNumbers[j - 1, 0]) > index))
{
iNumbers[j, k] = iNumbers[j - 1, k];
j = j - 1;
}
iNumbers[j, 0] = Convert.ToString(index);
}
}
}
static void printArray(string[,] iNumbers)
{
for (int i = 0; i < iNumbers.GetLength(0); i++)
{
for (int k = 0; k < iNumbers.GetLength(1); k++)
{
Console.Write(iNumbers[i, k] + " ");
}
}
Console.WriteLine();
}
static void Main(字符串[]args)
{
字符串[,]a=新字符串[,]
{
{“2”,“Pena”,“Pena”},
{“1”,“Kon”,“Kon”},
{“5”,“Sopol”,“Sopol”},
{“4”,“帕斯特”,“帕斯特”},
{“7”,“库车”,“库车”}
};
intb=a.GetLength(0);
控制台写入线(b);
Console.WriteLine(a[0,0]);
Console.WriteLine(a[0,1]);
Console.WriteLine(a[1,0]);
插入排序(a、b);
Console.WriteLine();
Write(“排序数组:”);
打印阵列(a);
Console.WriteLine();
控制台。写入(“按任意键关闭”);
Console.ReadKey();
}
公共静态void InsertionSort(字符串[,]iNumbers,int-iArraySize)
{
int i,j,索引;
对于(i=1;i0)和&(Convert.ToInt32(iNumbers[j-1,0])>索引))
{
iNumbers[j,k]=iNumbers[j-1,k];
j=j-1;
}
iNumbers[j,0]=转换为字符串(索引);
}
}
}
静态void打印数组(字符串[,]iNumbers)
{
for(int i=0;i
不幸的是,我得到的输出
1个Pena Pena 2个Kon Kon 4个Sopol Sopol 5个Paste Paste 7个Kuche Kuche
如果你能帮助我,我将非常感激 根据示例和问题的性质,我猜这是一个家庭作业,因此必须以a)离当前示例不远的方式执行,b)实际演示插入排序 考虑到这一点,以下是示例的正确版本:
public static void InsertionSort(string[,] iNumbers, int iArraySize)
{
int i, j, index;
for (i = 1; i < iArraySize; i++)
{
index = Convert.ToInt32(iNumbers[i, 0]);
j = i;
while ((j > 0) && (Convert.ToInt32(iNumbers[j - 1, 0]) > index))
{
for (int k = 0; k < iNumbers.GetLength(1); k++)
{
string temp = iNumbers[j, k];
iNumbers[j, k] = iNumbers[j - 1, k];
iNumbers[j - 1, k] = temp;
}
j = j - 1;
}
}
}
publicstaticvoidinsertionsort(字符串[,]iNumbers,int-iArraySize)
{
int i,j,索引;
对于(i=1;i0)和&(Convert.ToInt32(iNumbers[j-1,0])>索引))
{
for(int k=0;k
我对您的原始代码做了两个关键更改:
k
和j
循环,以便k
循环是最内部的循环,而不是j
循环。您的j
循环是执行实际排序的循环,而k
循环是为插入操作实际移动行的循环k
循环来执行实际插入
以上内容应该足以让你回到任务的轨道上。但是,我要提到的是,如果您的老师允许您使用交错数组(即包含多个其他一维数组的一维数组)或使用第二个“索引数组”,您可以完全摆脱
k
循环(即,交换相对于原始数组的索引,但保留原始数组不变)。这看起来像是家庭作业。如果您能够澄清问题的确切限制,这将非常有用。您面临的主要问题是k
循环(这实际上不是插入排序本身的一部分)属于j
循环(即,而不是外部。在您的代码中,当您尝试对除行的第一个元素以外的任何内容进行排序时,索引本身已排序,因此循环无法对其他部分进行重新排序。但是,如果您使用锯齿数组,或者仅对原始数据进行索引,则整个过程将不会受到该错误的影响。您的老师是否允许这些方法?
public static void InsertionSort(string[,] iNumbers, int iArraySize)
{
int i, j, index;
for (i = 1; i < iArraySize; i++)
{
index = Convert.ToInt32(iNumbers[i, 0]);
j = i;
while ((j > 0) && (Convert.ToInt32(iNumbers[j - 1, 0]) > index))
{
for (int k = 0; k < iNumbers.GetLength(1); k++)
{
string temp = iNumbers[j, k];
iNumbers[j, k] = iNumbers[j - 1, k];
iNumbers[j - 1, k] = temp;
}
j = j - 1;
}
}
}