我是新来的并且抱歉如果我的问题很愚蠢,但我真的需要你的帮助。 我需要通过id(第一列)对二维字符串数组进行排序:
string [,] a = new string [,]
{
{"2","Pena","pena"},
{"1","Kon","kon"},
{"5","Sopol","sopol"},
{"4","Pastet","pastet"},
{"7","Kuche","kuche"}
};
问题在于我只对数字进行排序,我想在它们之后对单词进行排序。那是我到目前为止所做的事情
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();
}
不幸的是作为输出我得到了
1 Pena pena 2 Kon kon 4 Sopol sopol 5 Pastet pastet 7 Kuche kuche
如果你能帮助我,我将非常感激。
答案 0 :(得分:2)
根据示例和问题的性质,我猜这是一个家庭作业,因此必须以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;
}
}
}
我对原始代码进行了两次重要更改:
k
和j
循环,以便k
循环是最内层循环,而不是j
循环。您的j
循环是执行实际排序的循环,而k
循环实际上应该为插入操作移动一行。在你原来的例子中,你反过来了,结果是当你去排除除行的索引元素之外的任何东西时,所有东西看起来都按照代码排序(因为它只是比较索引没有其他东西被移动。
使用上面的示例,首先确定插入点,然后然后 k
循环仅用于实际插入。
通过上述操作,使用了正确的传统交换:将要交换的值之一复制到临时局部变量,将要交换的另一个值复制到第一个值的位置,然后最后保存的值将复制到第二个位置。
上述内容应该足以让您重新回到正确的任务中。但是,我要提到的是,如果您的老师允许您使用锯齿状数组(即包含其他几个单维数组的单维数组)或使用,您可以完全摆脱k
循环第二个&#34;索引数组&#34; (即相对于原始数组交换索引的位置,但保持原始数组不变)。