具有多种排序方法

本文关键字:排序 方法 | 更新日期: 2023-09-27 18:29:44

我有一个有两个方法的类,一个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);
    }

具有多种排序方法

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

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

这里,newarray不是数组的副本,而是ProgramArray:的reference的副本

newarray = ProgramArray;

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

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

此外,我建议阅读关于值类型和引用类型之间的差异。

在.NET中,数组是引用类型。在快速排序中,行"newarray=ProgramArray"将newarray引用设置为与ProgramArray相同的实例。所以Array.Sort实际上是在ProgramArray上运行的。类似地,在ReverseArray中,Array.Reverse也在ProgramArray上运行。如果要复制阵列,请使用克隆()。

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

请尝试以下代码。将一个数组分配给另一个数组时,并不是在克隆或处理所有元素。您正在分配数组起始部分的内存地址。换句话说,您只是将一个引用变量分配给另一个数组。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();
    }
}

除了其他人告诉您的引用类型之外,我建议您将要排序的数组作为参数传递给排序方法,而不是使用全局数组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);
}