【问题标题】:Problem 3-way merge sorting strings in C#C#中的问题3路合并排序字符串
【发布时间】:2020-02-25 16:27:34
【问题描述】:

我最近偶然发现了一个使用 3 路归并排序算法但使用字符串的问题。 如您所见,我试图将它从我在https://www.geeksforgeeks.org/3-way-merge-sort/ 上找到的整数版本转换,但我被它调用递归方法的部分所困:

mergeSort3WayRec

看起来像这样:

void mergeSort3WayRec(int gArray[], int low, 
                  int high, int destArray[])  
{  

// If array size is 1 then do nothing  
if (high - low < 2)  
    return; 



// Splitting array into 3 parts  
int mid1 = low + ((high - low) / 3);  
int mid2 = low + 2 * ((high - low) / 3) + 1;  

// Sorting 3 arrays recursively  
mergeSort3WayRec(destArray, low, mid1, gArray);  
mergeSort3WayRec(destArray, mid1, mid2, gArray);  
mergeSort3WayRec(destArray, mid2, high, gArray);  

// Merging the sorted arrays  
merge(destArray, low, mid1, mid2, high, gArray);  
}

而且我不知道如何使它对字符串友好。下面是我已经做过的。有什么提示或帮助吗?

using System;

namespace ConsoleApp1
{
    class Program
    {

    public void merge(string[] sArray, string low, string mid1, string mid2, string high, string[] destSArray)
    {
        string i = low, j = mid1, k = mid2, l = low;
        {
            while((i.Length<mid1.Length) && (j.Length < mid2.Length) && (k.Length < high.Length))
            {
                if(sArray[Array.IndexOf(sArray,l)].Length < sArray[Array.IndexOf(sArray, k)].Length)
                {
                    int ls = Array.IndexOf(sArray, l);
                    int iss = Array.IndexOf(sArray, i);
                    destSArray[ls++] = sArray[iss++];
                }
                else
                {
                    int ls = Array.IndexOf(sArray, l);
                    int ks = Array.IndexOf(sArray, k);
                    destSArray[ls++] = sArray[ks++];
                }
            }

            while ((i.Length < mid1.Length) && (j.Length < mid2.Length))
            {
                if (sArray[Array.IndexOf(sArray, i)].Length < sArray[Array.IndexOf(sArray, j)].Length)
                {
                    int ls = Array.IndexOf(sArray, l);
                    int iss = Array.IndexOf(sArray, i);
                    destSArray[ls++] = sArray[iss++];
                }
                else
                {
                    int ls = Array.IndexOf(sArray, l);
                    int js = Array.IndexOf(sArray, j);
                    destSArray[ls++] = sArray[js++];
                }
            }

            while ((j.Length < mid2.Length) && (k.Length < high.Length))
            {
                if (sArray[Array.IndexOf(sArray, j)].Length < sArray[Array.IndexOf(sArray, k)].Length)
                {
                    int ls = Array.IndexOf(sArray, l);
                    int js = Array.IndexOf(sArray, j);
                    destSArray[ls++] = sArray[js++];
                }
                else
                {
                    int ls = Array.IndexOf(sArray, l);
                    int ks = Array.IndexOf(sArray, k);
                    destSArray[ls++] = sArray[ks++];
                }
            }

            while ((i.Length < mid1.Length) && (k.Length < high.Length))
            {
                if (sArray[Array.IndexOf(sArray, i)].Length < sArray[Array.IndexOf(sArray, k)].Length)
                {
                    int iss = Array.IndexOf(sArray, i);
                    int ls = Array.IndexOf(sArray, l);
                    destSArray[ls++] = sArray[iss++];
                }
                else
                {
                    int ls = Array.IndexOf(sArray, l);
                    int ks = Array.IndexOf(sArray, k);
                    destSArray[ls++] = sArray[ks++];
                }
            }

            while (i.Length < mid1.Length)
            {
                int ls = Array.IndexOf(sArray, l);
                int iss = Array.IndexOf(sArray, i);
                destSArray[ls++] = sArray[iss++];
            }
            while (j.Length < mid2.Length)
            {
                int ls = Array.IndexOf(sArray, l);
                int js = Array.IndexOf(sArray, j);
                destSArray[ls++] = sArray[js++];
            }
            while (k.Length < high.Length)
            {
                int ls = Array.IndexOf(sArray, l);
                int ks = Array.IndexOf(sArray, k);
                destSArray[ls++] = sArray[ks++];
            }
        }
    }

    public void mergeSort3Way(string[] sArray, int n)
    {

        if (n == 0)
            return;

        string[] fArray = new string[n];
        for(int i = 0; i < n; i++)
        {
            fArray[i] = sArray[i];

        }
        mergeSort3Way(fArray, 0, n, sArray);
    }
    static void Main(string[] args)
    {

    }
}
}

【问题讨论】:

  • 为什么是 C++ 标签?
  • @EJoshuaS-ReinstateMonica 我是 stackoverflow 的新手,我想也许如果我添加标签具有 c++ 知识的人仍然可以提供帮助
  • C# 和 C++ 是完全不同的语言。
  • @EJoshuaS-ReinstateMonica 我删除了 c++ 标签。谢谢。
  • 这段代码的确切问题是什么?

标签: c#


【解决方案1】:

人们对您的问题投了反对票,因为您似乎正试图将分配给您的任务卸载到 StackOverflow,这不是本网站的用途。这是我的建议:

1 弄清楚整数的代码是如何工作的。这是必不可少的一步。这可能很难做到;所以也许你想从更简单的算法开始。阅读冒泡排序,为整数编写冒泡排序,为字符串编写冒泡排序,检查差异。

2 调试整数代码。您是否了解每条线的作用以及如果将其删除会发生什么?您了解每个变量的用途吗?您了解为什么特定变量在运行时的给定时间具有特定值吗?

完成这两个步骤后,您应该能够更改代码以使用字符串而不是整数,而不会出现问题。

【讨论】:

    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2017-09-22
    • 2020-01-28
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多