2017-04-25 62 views
0

我试图编程阵列排序和搜索程序,将被处理的字符串中600项array.The数据要被排序的长相这样:合并排序在C#字符串数组

2017 | 25 |一月| 9994750 | 27.640 | 36.800 | DODECANESE ISLANDS,GREECE | 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); 
     } 
    } 
+0

尝试重新调整代码的功能往往比它的价值更大。这似乎是一个简单的任务,你会从头开始更好。 – coinbird

+0

@coinbird什么?这是非常简单的使用泛型。没有理由“从头开始” – Amy

+0

您应该使用实现IComparable的泛型来实现排序。 'public void MergeSort (this T [] elements)where T:IComparable {}' –

回答

2

为了让你的算法对不同类型的工作,我们使用C#泛型。我做了如下修改代码:改名为numbers参数

  • values,以便更好地适应其他的变化
  • 改变了阵列的数据类型从stringT
  • 添加类型约束,因此要求T与其他T
  • 也将temp数组的类型更改为T
  • 您已经在使用CompareTo做你的比较,因此不需要其他的代码更改编辑:实际上,IComparable.CompareTostring.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); 
    } 
} 

然后,您可以调用此的任何类型的相当于本身的一个阵列上。 intstring都应该工作得很好。

+0

似乎它应该工作。由于某些原因,虽然.CompareTo部分抛出了“不能隐含地将_int_转换为_bool_”错误。 – GiggyLapisar

+0

@GiggyLapisar好吧,'如果项目相等,CompareTo'返回'0';如果左边的项目先排序,则返回-1;如果右边的项目先排序,则返回1。所以比较适当的整数。我*认为*你应该添加'<0'的条件。对不起,我没有可用的atm编辑器。应该是:if(values [left] .CompareTo(values [mid])<0)'。 *我认为* – Amy

+0

@GiggyLapisar请参阅[备注](https://msdn.microsoft.com/en-us/library/4d7sx9hd(v = vs.110).aspx) – Amy