使用快速排序算法按日历顺序排序月份

3

我正在编写一个程序,它需要能够对天气数据进行排序。其中一个功能是在按月份排序数据时,必须按照它们在日历中出现的顺序排序(如果按升序排序,则必须是一月,二月,三月等,而不是四月,八月等)。

我的问题是算法(QuickSort)没有按照我想要的方式对数组进行排序。

public static void sortMonths(string[] month,int left,int right)
{
    Dictionary<string,int> monthsDictionary = new Dictionary<string,int>()
    {
        {"January",1},
        {"February",2},
        {"March",3},
        {"April",4},
        {"May", 5},
        {"June", 6},
        {"July", 7},
        {"August", 8},
        {"September", 9},
        {"October", 10},
        {"November", 11},
        {"December", 12},
    };

    int i = left,j = right;

    string[] sortedMonth = month;

    string tempMonth;

    string pivot = sortedMonth[(i+j)/2];

    while(i<=j)
    {
        while(monthsDictionary[sortedMonth[i]] < monthsDictionary[pivot])
            i++;
        while(monthsDictionary[sortedMonth[j]] > monthsDictionary[pivot])
            j--;
        if(i <= j)
        {
            tempMonth = sortedMonth[i];
            sortedMonth[i] = sortedMonth[j];
            sortedMonth[j] = tempMonth;

            i++;
            j--;
        }
    };

    if(left < j)
    {
        sortMonths(sortedMonth,left,j);
    }
    else if(i < right)
    {
        sortMonths(sortedMonth,i,right);
    }

    for(int ctr = 0;ctr < sortedMonth.Length; ctr++)
        Console.WriteLine(sortedMonth[ctr]);
}

我听说一种解决这个任务的方法是使用字典将月份名称映射到它们对应的数字值,这正是我正在做的,但仍然似乎不起作用。我只想知道我做错了什么以及应该怎么做才能修复它。也许有一个更好的解决方案或者更好的算法可以使用?此外,我不允许使用预定义的排序函数,最后的for循环只是为了检查数组是否已经正确排序。


1
我不会在这个任务中使用字典,因为: “为了枚举,字典中的每个项都被视为表示值及其键的KeyValuePair<TKey,TValue>结构。返回项目的顺序是未定义的。” 我会创建一个包装月份{name,value}的类,然后实例化一个Month数组来进行排序。string[] sortedMonth = month,在快速排序中该变量是不必要的。 - raven
你的代码看起来没问题,但为什么每次调用时都会打印结果? - Arturo Menchaca
Roberto De La Parra- 请问,我应该如何实现你提到的那个类?Arturo Menchaca- 我这样做是为了确保它正确地对数组进行排序。在构建完这个算法后,我会删除那个for循环。 - terasss2
1个回答

1
  1. 将你的月份转换为整数。你需要一个 int[]

  2. int[] 进行排序。

  3. int[] 转换回 string[](月份名称)。

  4. 用排序后的值覆盖原始 month 数组中的所有值。


但是月份是字符串,也就是说,它们不是数字。你还能将它们转换吗? - terasss2
1
"一月" -> 0,"二月" -> 1,等等。您需要示例C#代码吗?提示:int ConvertMonthStringToInt(string month) { switch (month) { ... } } - Asik
谢谢。我会试一试。 - terasss2
1
谢谢你的解决方案。它能正确地运作。此外,我已经摆脱了那个快速排序末尾的for循环,因为它一直在递归地打印无意义的值,因此,这让我非常困惑。但是感谢你的帮助,我会把你列为参考。 - terasss2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接