有多种排序方法

时间:2012-04-01 18:58:44

标签: c# sorting console-application

我有一个包含两个方法的类,一个是QuickSort()和一个ReverseArray()。当我传入数组时,它首先调用QuickSort(),然后调用ReverseArray(),但是当它到达ReverseArray()时,它会从QuickSort()反转已排序的数组,而不是反转所创建的原始数组。我究竟做错了什么?任何建议都将不胜感激。

    public class Program
    {
    private readonly int[] ProgramArray = new int[10] ;
    public Program(int[] array)
    {
       ProgramArray = array;
       QuickSort();
       ReverseArray();
    }

    public void QuickSort()
    {   
        var newarray = new int[10];
        newarray = ProgramArray;
        Array.Sort(newarray);
        Print(newarray, "QuickSort");
    }

    public void ReverseArray()
    {
        var newarray = new int[10];
        newarray = ProgramArray;
        Array.Reverse(newarray);
        Print(newarray, "Reversed");
    }

    public static void Print(int[] array, string methodname)
    {
        int[] newarray = array;
        Console.Write(string.Format("{0}: ", methodname));
        for (int i = 0; i < newarray.Length; i++)
        {
            Console.Write(newarray[i] + " ");
        }
        Console.Write("\n");
    }

    static void Main(string[] args)
    {
        var array = new int[10] { 12, 24, 3, 44, 5, 16, 7, 34, 23, 34 };
        var program = new Program(array);

    }

5 个答案:

答案 0 :(得分:4)

数组是引用类型。您正在整个代码库中处理相同的引用。

如果您想要数组的副本,则需要复制它。

此处,newarray不是数组的副本,而是引用ProgramArray的副本:

newarray = ProgramArray;

使用Array上定义的Copy方法创建副本:

Array.Copy(ProgramArray, newarray, ProgramArray.Length);

另外,我建议阅读value types and reference types之间的差异。

答案 1 :(得分:1)

在.NET中,数组是引用类型。在QuickSort中,“newarray = ProgramArray”行将newArray引用设置为与ProgramArray相同的实例。所以Array.Sort实际上是在ProgramArray上运行的。同样,在ReverseArray中,Array.Reverse也在ProgramArray上运行。如果要复制数组,请使用克隆()。

答案 2 :(得分:1)

Array是一种对象引用类型,因此语句newarray = ProgramArray;会导致newArray引用与ProgramArray相同的数组。为避免这种情况,您必须复制数组。

答案 3 :(得分:1)

请尝试使用以下代码。将一个数组分配给另一个数组时,您不会克隆或处理所有元素。您正在分配数组开头部分的内存地址。换句话说,您只是将引用变量分配给另一个数组。 I.E.所有数组变量都指向相同的地址空间,因此即使使用不同的变量名,也要修改相同的数组。

public class Program
{
    private readonly int[] ProgramArray = new int[10];
    public Program(int[] array)
    {
        ProgramArray = array;
        QuickSort();
        ReverseArray();
    }

    public void QuickSort()
    {
        var newarray = new int[10];
        newarray = (int[])ProgramArray.Clone();
        Array.Sort(newarray);
        Print(newarray, "QuickSort");
    }

    public void ReverseArray()
    {
        var newarray = new int[10];
        newarray = (int[])ProgramArray.Clone();
        Array.Reverse(newarray);
        Print(newarray, "Reversed");
    }

    public static void Print(int[] array, string methodname)
    {
        int[] newarray = array;
        Console.Write(string.Format("{0}: ", methodname));
        for (int i = 0; i < newarray.Length; i++)
        {
            Console.Write(newarray[i] + " ");
        }
        Console.Write("\n");
    }

    static void Main(string[] args)
    {
        var array = new int[10] { 12, 24, 3, 44, 5, 16, 7, 34, 23, 34 };
        Print(array, "Original Array");
        var program = new Program(array);
        Console.ReadKey();
    }
}

答案 4 :(得分:1)

除了其他人告诉你的关于引用类型的内容之外,我建议你将数组作为参数传递给排序方法,而不是使用全局数组ProgramArray。这使得更容易理解信息流。

public void QuickSort(int[] array)
{
    // Easiest way to get a copy of the array
    var newArray = (int[])array.Clone();
    ...
}

public void ReverseArray(int[] array)
{
    var newArray = (int[])array.Clone();
    ...
}

public Program(int[] array)
{      
    QuickSort(array);
    ReverseArray(array);
}