2017-04-25 63 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