2015-10-11 1 views
0

Я играю с сортировкой массивов, и я выяснил, как MergeSort массива int. Но я не могу определить MergeSort строковый массив. Сортировка строкового массива достаточно проста, когда обычная сортировка, но сортировка слияния отличается. Код, который я сделал до сих пор, находится ниже и работает с массивами int.C# merge sort string array

public int number = 1; 
public void mergeSort(int[] sortArray, int lower, int upper) 
    { 
     int middle; 
     if (upper == lower) 
      return; 
     else 
     { 
      middle = (lower + upper)/2; 
      mergeSort(sortArray, lower, middle); 
      mergeSort(sortArray, middle + 1, upper); 
      Merge(sortArray, lower, middle + 1, upper); 
     } 
    } 
public void Merge(int[] sortArray, int lower, int middle, int upper) 
    { 
     string[] temp = new string[sortArray.Length]; 
     int lowEnd = middle - 1; 
     int low = lower; 
     int n = upper - lower + 1; 
     while ((lower <= lowEnd) && (middle <= upper)) 
     { 
      if (sortArray[lower] <= sortArray[middle]) 
      { 
       temp[low] = sortArray[lower].ToString(); 
       low++; 
       lower++; 
      } 
      else 
      { 
       temp[low] = sortArray[middle].ToString(); 
       low++; 
       middle++; 
      } 
     } 
     while (lower <= lowEnd) 
     { 
      temp[low] = sortArray[lower].ToString(); 
      low++; 
      lower++; 
     } 
     while (middle <= upper) 
     { 
      temp[low] = sortArray[middle].ToString(); 
      low++; 
      middle++; 
     } 
     for (int i = 0; i < n; i++) 
     { 
      sortArray[upper] = Int32.Parse(temp[upper]); 
      upper--; 
     } 
    } 
private void btnExecute_Click(object sender, EventArgs e) 
    { 
     String arraylength; 
     int num; 
     arraylength = Microsoft.VisualBasic.Interaction.InputBox("Enter a number to determine the length of the array", "Enter Number"); 
     try 
     { 
      while (!(int.TryParse(arraylength, out num))) 
      { 
       MessageBox.Show("Not a valid number, try again."); 
       arraylength = Microsoft.VisualBasic.Interaction.InputBox("Enter a number a to determine the length of the array", "Enter Number"); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Value entered is not in a valid format"); 
     } 
     int intlength = Int32.Parse(arraylength); 

     string[] stringsArray = new string[intlength]; 


     int arraypos = 0; 
     // For display purposes 
     int positionvalue = 1; 
     txtOutput.Text += "Unsorted array: \r\n"; 
     foreach (string s in stringsArray) 
     { 
      string arrayvalue = Microsoft.VisualBasic.Interaction.InputBox("Enter a number for array value" + positionvalue, "Enter Number"); 
      string arrayvalues = arrayvalue; 
      stringsArray[arraypos] = arrayvalues.ToString(); 

      txtOutput.Text += arrayvalues + "\t"; 
      arraypos++; 
      positionvalue++; 
     } 
     mergeSort(stringsArray, 0, stringsArray.Length - 1); 

     txtOutput.Text += "\r\nSorted array: \r\n"; 
     foreach (string i in stringsArray) 
     { 
      txtOutput.Text += i + "\t"; 
     } 

    } 
+0

в C# вы можете сравнить две строки, такие как int, и использовать код выше для вашего массива строк. – aisa

+0

Вместо использования 'a <= b' вы можете использовать' IComparer .Compare (a, b) <= 0'. Вы можете использовать сопоставление по умолчанию для типа 'T':' Comparer .Default', или вы можете разрешить вызывающему абоненту указать свой экземпляр 'IComparer '. – PetSerAl

ответ

0

Я думаю, что главная проблема, вы столкнулись при использовании вашего рода для string является ниже линии

if (sortArray[lower] <= sortArray[middle]) 

Потому что вы не можете использовать <= на двух струнах. Скорее всего, вы можете использовать метод string.CompareTo(). См. MSDN doc по телефону IComparable за string.

Так как вы можете использовать это в вашем коде, вы можете изменить свой код, чтобы быть как

while ((lower <= lowEnd) && (middle <= upper)) //notice the CompareTo 
{ 
    if (sortArray[lower].CompareTo(sortArray[middle]) < 1) //<= here 
    { 
     temp[low] = sortArray[lower]; 
     low++; 
     lower++; 
    } 
    else 
    { 
     temp[low] = sortArray[middle]; 
     low++; 
     middle++; 
    } 
} 

Вы, возможно, потребуется скорректировать свою последнюю петлю и несколько других мелких питания.

for (int i = 0; i < n; i++) 
{ 
    sortArray[upper] = temp[upper]; //sortArray is string[] 
    upper--; 
}