【发布时间】: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#