2.1.16

2.1.16 #

解答 #

如果移动数据时新建了对象,那么虽然值没有改变,但是数组中的对象被修改了。

代码 #

插入排序中的 Exch() 换成了如下方式:

string temp = new string(s[i].ToCharArray());
s[i] = s[min];
s[min] = temp;

全部程序代码如下:

var test = new[] { "a", "b", "d", "c", "e" };
Console.WriteLine(CheckArraySort(test));
Console.WriteLine(CheckSelectionSort(test));

// 测试 Array.Sort() 方法。
static bool CheckArraySort(string[] a)
{
    var backup = new string[a.Length];
    a.CopyTo(backup, 0);

    Array.Sort(a);

    foreach (var n in a)
    {
        var isFind = false;
        for (var i = 0; i < a.Length; i++)
        {
            if (ReferenceEquals(n, backup[i]))
            {
                isFind = true;
                break;
            }
        }

        if (!isFind)
        {
            return false;
        }
    }

    return true;
}

// 测试选择排序。
static bool CheckSelectionSort(string[] a)
{
    var backup = new string[a.Length];
    a.CopyTo(backup, 0);

    SelectionSort(a);

    foreach (var n in a)
    {
        var isFind = false;
        for (var i = 0; i < a.Length; i++)
        {
            if (ReferenceEquals(n, backup[i]))
            {
                isFind = true;
                break;
            }
        }

        if (!isFind)
        {
            return false;
        }
    }

    return true;
}

// 选择排序,其中的交换部分使用新建对象并复制的方法。
static void SelectionSort(string[] s)
{
    for (var i = 0; i < s.Length; i++)
    {
        var min = i;
        for (var j = i + 1; j < s.Length; j++)
        {
            if (s[j].CompareTo(s[min]) < 0)
            {
                min = j;
            }
        }

        var temp = new string(s[i].ToCharArray());
        s[i] = s[min];
        s[min] = temp;
    }
}