我正在尝试编写一个数组排序和搜索程序,它将处理一个字符串数组中的600个项目。要排序的数据看起来像这样:
2017 | 25 |一月| 9994750 | 27.640 | 36.800 | DODECANESE ISLANDS,GREECE | 1485307173 | 01:19:33 | 4.000 |
我一直在尝试实现合并排序来对这些数据进行排序。但是,我无法弄清楚如何将为int数组设计的合并排序程序转换为用于排序字符串数组的程序。谁能解释我怎么能这样做?
虽然这可以通过使用现有的内置函数来完成,但我一直在尝试为明年的大学课程做准备,因此我不得不从头开始编写Merge类,而不是使用内置函数。
旁注:我必须注意到,我知道在目前的形式下,即使使用合并排序,程序也无法自然地排序几个月,但是我已经有了一个工作轮,因为我可以将合并排序操作为意图。
当前的合并排序程序:
static public void MainMerge(string[] numbers, int left, int mid, int right)
{
int[] temp = new int[25];
int i, eol, num, pos;
eol = (mid - 1);
pos = left;
num = (right - left + 1);
while ((left <= eol) && (mid <= right))
{
if (numbers[left].CompareTo(numbers[mid]))
temp[pos++] = numbers[left++];
else
temp[pos++] = numbers[mid++];
}
while (left <= eol)
temp[pos++] = numbers[left++];
while (mid <= right)
temp[pos++] = numbers[mid++];
for (i = 0; i < num; i++)
{
numbers[right] = temp[right];
right--;
}
}
static public void SortMerge(string[] numbers, int left, int right)
{
int mid;
if (right > left)
{
mid = (right + left) / 2;
SortMerge(numbers, left, mid);
SortMerge(numbers, (mid + 1), right);
MainMerge(numbers, left, (mid + 1), right);
}
}
答案 0 :(得分:3)
为了让您的算法在不同类型上运行,我们使用C#Generics。我对您的代码进行了以下更改:
numbers
参数重命名为values
,以更好地适应其他更改string
更改为T
T
需要与其他T
temp
数组的类型更改为T
。CompareTo
进行比较,因此无需更改其他代码编辑:实际上,IComparable.CompareTo
的返回值与string.CompareTo
不同,因此需要进行小幅调整。我使用IComparable<T>
代替IComparable
。两者都应该同样适用于您的目的。
代码如下:
static public void MainMerge<T>(T[] values, int left, int mid, int right) where T : IComparable<T>
{
T[] temp = new T[25];
int i, eol, num, pos;
eol = (mid - 1);
pos = left;
num = (right - left + 1);
while ((left <= eol) && (mid <= right))
{
if (values[left].CompareTo(values[mid]))
temp[pos++] = values[left++];
else
temp[pos++] = values[mid++];
}
while (left <= eol)
temp[pos++] = values[left++];
while (mid <= right)
temp[pos++] = values[mid++];
for (i = 0; i < num; i++)
{
values[right] = temp[right];
right--;
}
}
static public void SortMerge<T>(T[] values, int left, int right) where T : IComparable<T>
{
int mid;
if (right > left)
{
mid = (right + left) / 2;
SortMerge(values, left, mid);
SortMerge(values, (mid + 1), right);
MainMerge(values, left, (mid + 1), right);
}
}
然后,您可以在与自身相当的任何类型的数组上调用它。 int
和string
都可以正常使用。