2015-10-11 95 views
0

我玩排序数组,我想出了如何MergeSort一个int数组。但我不知道MergeSort一个字符串数组。排序字符串数组很容易,但正常排序但合并排序不同。我到目前为止所做的代码位于下方,正在处理int数组。C#合并排序字符串数组

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

您可以使用'IComparer .Compare(a,b)<= 0'来代替使用'a <= b'。您可以使用默认比较器来输入'T':'Comparer .Default',或者您可以允许调用者指定它自己的'IComparer '实例。 – PetSerAl

回答

0

我觉得你是在使用你的排序为string面临的主要问题是低于线

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

因为你不能在两个字符串使用<=。相反,你可以做的是,你可以使用string.CompareTo()方法。有关string,请参阅IComparable上的MSDN doc

既然你可以使用在你的代码,你可以改变你的代码是一样

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--; 
}