使用插入排序按ID对二维字符串数组进行排序 - C#

时间:2015-03-01 15:39:39

标签: c# arrays sorting

我是新来的并且抱歉如果我的问题很愚蠢,但我真的需要你的帮助。 我需要通过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

如果你能帮助我,我将非常感激。

1 个答案:

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

我对原始代码进行了两次重要更改:

  1. 我重新排列了kj循环,以便k循环是最内层循环,而不是j循环。您的j循环是执行实际排序的循环,而k循环实际上应该为插入操作移动一行。
  2. 在你原来的例子中,你反过来了,结果是当你去排除除行的索引元素之外的任何东西时,所有东西看起来都按照代码排序(因为它只是比较索引没有其他东西被移动。

    使用上面的示例,首先确定插入点,然后然后 k循环仅用于实际插入。

    1. 我添加了实际交换元素的逻辑。在您的原始代码中,那里并没有真正的交换。您已经对交换的第二部分进行了硬编码,只需将索引元素复制到目标,因此交换确实适用于索引元素。但它不会实现任何其他元素的交换;相反,你只是覆盖了数据。
    2. 通过上述操作,使用了正确的传统交换:将要交换的值之一复制到临时局部变量,将要交换的另一个值复制到第一个值的位置,然后最后保存的值将复制到第二个位置。


      上述内容应该足以让您重新回到正确的任务中。但是,我要提到的是,如果您的老师允许您使用锯齿状数组(即包含其他几个单维数组的单维数组)或使用,您可以完全摆脱k循环第二个&#34;索引数组&#34; (即相对于原始数组交换索引的位置,但保持原始数组不变)。