C#合并排序字符串数组

时间:2015-10-11 03:52:02

标签: c# arrays string sorting mergesort

我正在玩排序数组,我想出了如何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";
        }

    }

1 个答案:

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