Наличие нескольких методов сортировки - PullRequest
0 голосов
/ 01 апреля 2012

У меня есть класс с двумя методами, A 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 ]

4 голосов
/ 01 апреля 2012

Массив имеет тип reference .Вы работаете с одинаковыми ссылками по всей базе кода.

Если вам нужна копия массива, вам нужно скопировать ее.

Здесь newarray не является копией массива, но является копией ссылки на ProgramArray:

newarray = ProgramArray;

Используйте Copy метод, определенный в Array для создания копий:

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

Также я предлагаю прочитать о различиях между типами значений и ссылочными типами .

1 голос
/ 01 апреля 2012

В дополнение к тому, что другие говорили вам о ссылочных типах, я предлагаю вам передать массив для сортировки в качестве параметра методам сортировки вместо использования глобального массива 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);
}
1 голос
/ 01 апреля 2012

Попробуйте приведенный ниже код. При назначении одного массива другому, вы не копируете и не копируете все элементы. Вы назначаете адрес памяти начальной части массива. Другими словами, вы просто присваиваете ссылочную переменную другому массиву. И.Е. Все переменные массива указывают на одно и то же адресное пространство, поэтому вы модифицируете один и тот же массив, даже если вы используете разные имена переменных.

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();
    }
}
1 голос
/ 01 апреля 2012

Массив является ссылочным типом объекта, поэтому оператор newarray = ProgramArray; заставляет newArray ссылаться на тот же массив, что и ProgramArray. Чтобы избежать этого, вам придется скопировать массив.

1 голос
/ 01 апреля 2012

В .NET массивы являются ссылочными типами. В быстрой сортировке строка "newarray = ProgramArray" устанавливает ссылку newArray на тот же экземпляр, что и на ProgramArray. Итак, Array.Sort на самом деле работает с ProgramArray. Точно так же в ReverseArray Array.Reverse также работает с ProgramArray. Если вы хотите скопировать массив, используйте Clone ().

...