具有多种排序方法
本文关键字:排序 方法 | 更新日期: 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);
}