C# 使用插入排序-C按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",

我是新来的,如果我的问题很愚蠢,我很抱歉,但我真的需要你的帮助。 我需要按id(第一列)对二维字符串数组进行排序:

问题是我只对数字进行排序,我想在它们之后对单词进行排序。到目前为止我就是这么做的

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