【问题标题】:C# merge sort string arrayC# 归并排序字符串数组
【发布时间】:2015-10-11 03:52:01
【问题描述】:

我正在玩排序数组,我想出了如何 MergeSort 一个 int 数组。但我无法弄清楚 MergeSort 一个字符串数组。正常排序时对字符串数组进行排序很容易,但合并排序不同。到目前为止我所做的代码如下,并且正在处理 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";
        }

    }

【问题讨论】:

  • 在 C# 中,您可以比较两个字符串,如 int,并将上面的代码用于您的字符串数组。
  • 您可以使用IComparer&lt;T&gt;.Compare(a, b) &lt;= 0,而不是使用a &lt;= b。您可以对T 类型使用默认比较器:Comparer&lt;T&gt;.Default,或者您可以允许调用者指定自己的IComparer&lt;T&gt; 实例。

标签: c# arrays string sorting mergesort


【解决方案1】:

我认为您在将您的排序用于string 时面临的主要问题是以下行

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

因为你不能在两个字符串上使用&lt;=。相反,您可以做的是,您可以使用string.CompareTo() 方法。请参阅IComparable 上的MSDN doc 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--;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多