C# 在C中对字符串数组进行合并排序#

C# 在C中对字符串数组进行合并排序#,c#,arrays,sorting,merge,mergesort,C#,Arrays,Sorting,Merge,Mergesort,我正在尝试编写一个数组排序和搜索程序,该程序将在一个字符串数组中处理600项。要排序的数据如下所示: 2017年| 25 | 1月| 9994750 | 27.640 | 36.800 |希腊多德卡尼群岛| 1485307173 | 01:19:33 | 4.000| 我一直在尝试实现一个合并排序来对这些数据进行排序。但是,我无法理解如何将为int数组设计的合并排序程序转换为为为字符串数组设计的排序程序。谁能解释一下我是怎么做到的 虽然这可以通过使用现有的内置函数来实现,但我一直在尝试这一点,为

我正在尝试编写一个数组排序和搜索程序,该程序将在一个字符串数组中处理600项。要排序的数据如下所示:

2017年| 25 | 1月| 9994750 | 27.640 | 36.800 |希腊多德卡尼群岛| 1485307173 | 01:19:33 | 4.000|

我一直在尝试实现一个合并排序来对这些数据进行排序。但是,我无法理解如何将为int数组设计的合并排序程序转换为为为字符串数组设计的排序程序。谁能解释一下我是怎么做到的

虽然这可以通过使用现有的内置函数来实现,但我一直在尝试这一点,为明年的大学课程做准备,因此我必须从头开始编程合并排序,而不是使用内置函数

旁注:我必须注意,我知道在目前的形式下,即使使用合并排序,程序也无法自然排序,但这是我已经有了一个工作循环,我可以让合并排序按预期运行

当前合并排序程序:

        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);
        }
    }
static public void MainMerge(字符串[]数字,左整数,中整数,右整数)
{
int[]temp=新int[25];
int i、eol、num、pos;
下线=(中-1);
pos=左;
num=(右-左+1);

((左为了允许您的算法在不同类型上运行,我们使用C#泛型。我对您的代码做了以下更改:

  • numbers
    参数重命名为
    values
    ,以更好地适应其他更改
  • 将数组的数据类型从
    string
    更改为
    T
  • 添加了类型约束,因此要求
    T
    与其他
    T
  • temp
    数组的类型也更改为
    T
  • 您已经在使用
    CompareTo
    进行比较,因此不需要对其他代码进行更改编辑:实际上,
    i可比较。CompareTo
    的返回值与
    string.CompareTo
    不同,因此需要进行小的调整
我使用了
IComparable
而不是
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);
    }
}
static public void MainMerge(T[]值,int left,int mid,int right),其中T:IComparable
{
T[]温度=新的T[25];
int i、eol、num、pos;
下线=(中-1);
pos=左;
num=(右-左+1);

((左为了允许您的算法在不同类型上运行,我们使用C#泛型。我对您的代码做了以下更改:

  • numbers
    参数重命名为
    values
    ,以更好地适应其他更改
  • 将数组的数据类型从
    string
    更改为
    T
  • 添加了类型约束,因此要求
    T
    与其他
    T
  • temp
    数组的类型也更改为
    T
  • 您已经在使用
    CompareTo
    进行比较,因此不需要对其他代码进行更改编辑:实际上,
    i可比较。CompareTo
    的返回值与
    string.CompareTo
    不同,因此需要进行小的调整
我使用了
IComparable
而不是
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);
    }
}
static public void MainMerge(T[]值,int left,int mid,int right),其中T:IComparable
{
T[]温度=新的T[25];
int i、eol、num、pos;
下线=(中-1);
pos=左;
num=(右-左+1);

while((左)尝试重新调整代码的用途通常比它的价值更大。这似乎是一个足够简单的任务,您最好从零开始。@coinbird什么?使用泛型非常简单。没有理由“从零开始”您应该使用实现IComparable的泛型实现排序。
public void MergeSort(此T[]元素),其中T:IComparable{}
是否有不能使用
Array.sort(Array)的原因;
而不是实现自己的排序?@GiggyLapisar在编码方面的进步意味着你正在学习以正确的方式做事。在这里,使用泛型将是正确的方式。复制代码并用
int
替换
string
会奏效,但这是一个糟糕的解决方案。尝试重新调整代码用途通常比这似乎是一项非常简单的任务,你最好从头开始。@coinbird什么?使用泛型非常简单。没有理由“从头开始”,你应该使用实现IComparable的泛型来实现排序。
public void MergeSort(此T[]元素)其中T:IComparable{}
是否有不能使用
Array.Sort(Array)的原因;
而不是实现自己的排序?@GiggyLapisar在编码方面的进步意味着你正在学习以正确的方式做事。在这里,使用泛型将是正确的方式。复制代码并用
int
替换
string
将奏效,但这是一个糟糕的解决方案。似乎应该奏效。出于某些原因尽管.CompareTo部分抛出一个“cannotimplicity convert int to bool”错误。@GiggyLapisar好的,
CompareTo
如果项目相等,则返回
0
,如果左边的项目先排序,-1,如果右边的项目先排序,则返回1。因此,请与适当的整数进行比较。我认为您应该将
<0
添加到条件中。抱歉,我没有可用的编辑器。应该是:
if(value[left].CompareTo(值[mid])<0)
.Ithink@GiggyLapisar看,是的,它工作得很好。非常感谢。现在我只需要快速阅读它来真正理解它是如何工作的。看起来我