【问题标题】:Sort two dimensional string array by id using insertion sort - C#使用插入排序按 id 对二维字符串数组进行排序 - C#
【发布时间】:2015-03-01 15:39:38
【问题描述】:

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

如果您能帮助我,我将不胜感激。

【问题讨论】:

  • 这看起来像家庭作业。如果您能阐明问题的确切约束,那将很有帮助。您遇到的主要问题是您的k 循环(它本身并不是插入排序的一部分)属于j 循环(它是)内部,而不是外部。在您的代码中,当您尝试对行的第一个元素以外的任何内容进行排序时,索引本身已被排序,因此您的循环无法重新排序其他部分。但是,如果您使用锯齿状数组,或者只是索引原始数据,那么整个事情就不会受到该错误的影响。你的老师允许这些方法吗?

标签: c# arrays sorting


【解决方案1】:

根据示例的性质和问题,我猜这是一项家庭作业,因此必须以 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 循环应该实际移动一行以进行插入操作。

在您的原始示例中,您对此进行了反转,结果当您对除行的索引元素之外的任何内容进行排序时,所有内容看起来都已按照代码排序(因为它只是比较索引元素)等等没有其他东西被移动。

在上面的例子中,插入点是先确定的,然后k循环只是用来做实际的插入。

  1. 我添加了逻辑来实际交换元素。在您的原始代码中,那里并没有真正的交换。您已经对交换的第二部分进行了硬编码,只需将索引元素复制到目标,因此交换确实适用于索引元素。但它不会实现任何其他元素的交换;相反,您只会覆盖数据。

通过上述方法,使用了适当的传统交换:将要交换的一个值复制到临时局部变量,将要交换的另一个值复制到第一个值的位置,然后最后保存的值被复制到第二个位置。


以上内容应该足以让您重回正轨。但是,我会提到,如果您的老师允许您使用锯齿状数组(即包含几个其他一维数组的一维数组)或使用第二个“索引数组”(即相对于原始数组交换索引的位置,但保持原始数组不变)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2021-08-16
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多