我正在玩排序数组,我想出了如何MergeSort一个int数组。但我无法弄清楚MergeSort是一个字符串数组。在正常排序时排序字符串数组很容易,但Merge Sort是不同的。我到目前为止所做的代码如下所示,正在处理int数组。
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 :(得分:0)
我认为使用string
排序时遇到的主要问题是以下行
if (sortArray[lower] <= sortArray[middle])
因为您无法在两个字符串上使用<=
。相反,你可以做的是,你可以使用string.CompareTo()
方法。有关IComparable
的信息,请参阅string
上的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--;
}