Использование массивов в нескольких классах в C # и сортировка вставкой не будут работать - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю над заданием для класса, в котором мне нужно использовать сортировку вставки в несортированном массиве, но это не совсем работает.Алгоритмы, которые я использовал для сортировки, меняли все значения на 0 или все на последнее значение (96) с 0 сверху.Код для класса массива

using System;

namespace UnorderedArrayListNamespace
{
public class UnorderedArrayList
{
    public int[] list;
    protected int next;
   // protected int Count;

    public UnorderedArrayList()
    {
        list = new int[100];
        next = 0;
    }



    public void insert(ref int item)
    {
        list[next] = item;
        next++;
    }

    public void remove(ref int item)
    {
        if (next == 0)
        {
        }
        else
        {
        //find value, if it exists
            for (int i = 0; i < next; i++)
            {
                if (item.Equals(list[i]))
                {
                    for (int j = i; j < next; j++) list[j] = list[j + 1];
                    next--;
                    break;
                }
            }
        }
    }

    public void removeAll(ref int item)
    {

    }

    public int[] InsertionSort(ref int item)
    {
        for (int i = 0; i < list.Length - 1; i++)
        {
            for (int j = i + 1; j > 0; j--)
            {
                if (list[j - 1] > list[j])
                {
                    int temp = list[j - 1];
                    list[j - 1] = list[j];
                    list[j] = temp;
                }
            }
        }
        return list;

    }

    public void Minmax(ref int item)
    {
        int  min , max;
        min = list[0];
        max = list[0];
        for (int i = 1; i < list.Length; i++)
        {
            if (min > list[i])
                min = list[i];
            if (max < list[i])
                max = list[i];
        }
        Console.WriteLine("min:" + min);
        Console.WriteLine("max:" + max);
    }
    public void print()
    {
        for (int i = 0; i < next; i++)
        {
            Console.WriteLine(list[i]);
        }
        Console.WriteLine();
    }
 }

}

Код для основного класса

namespace ConsoleApp3
{
class Program
{
    static void Main(string[] args)
    {
        UnorderedArrayList u = new UnorderedArrayList();

        u.print();
        int var = 7;
        u.insert(ref var);
        var = 12;
        u.insert(ref var);
        var = 5;
        u.insert(ref var);
        var = 5;
        u.insert(ref var);
        var = 5;
        u.insert(ref var);
        var = 96;
        u.insert(ref var);
        u.print();
        var = 5;
        u.remove(ref var);
        u.print();
        u.InsertionSort(ref var);
        u.print();
        u.Minmax(ref var);      
    }  
  }
}

Обновлен для включения всех частей класса Array.Извините, если это слишком долго, это мой первый пост, и я хотел быть тщательным.

по запросу комментария вот назначение:

Измените предоставленный класс UnorderedArrayList следующими способами:

а.метод remove () удаляет элемент из списка, сдвигая элементы списка.Однако, если удаляемый элемент находится в начале списка, а список довольно большой, выполнение этой операции может занять много времени компьютера.Поскольку элементы списка расположены не в определенном порядке, вы можете просто удалить элемент, скопировав последний элемент в списке в позиции удаляемого элемента и уменьшив длину списка.

b.метод remove удаляет только первое вхождение элемента.Добавьте метод removeAll (), который удалит все вхождения данного элемента.

с.добавьте методы min () и max (), которые будут возвращать наименьший и наибольший соответствующие элементы в списке

d.добавьте метод сортировки вставкой, который упорядочит список.

e.написать метод Main (), который тщательно проверяет эти модификации и демонстрирует правильность.

1 Ответ

0 голосов
/ 30 сентября 2018

Вот, пожалуйста.в InsertionSort я сначала добавил элемент, а затем сделал сортировку.Минимум - это первый элемент в списке после его сортировки, а максимум - последний элемент.Ваша логика MinMax была хороша, но она просто хотела, чтобы вы были в курсе, как только отсортированы, легко получить мин, макс.

Внимательно посмотрите на сортировку и как это сделать, запишите числа в порядкеили несортировщик и запишите, где они меняются местами.Это поможет вам понять логику.Важно, у вас есть i & j, представляющие положение элементов для сравнения.

7-12- 5- 5-96-5

5-12- 5- 5-96-7 (7 и 5 переключено)

5-5-12-5-96-7 (12 и 5 переключено) и т. Д.

Кроме того, removeAll - это тот же код без разрыва.

с использованием System;

namespace UnorderedArrayListNamespace
{
    public class UnorderedArrayList
    {
        public int[] list;
        protected int next;
        // protected int Count;

        public UnorderedArrayList()
        {
            list = new int[100];
            next = 0;
        }



        public void insert(ref int item)
        {
            list[next] = item;
            next++;
        }

        public void remove(ref int item)
        {
            //find value, if it exists
            for (int i = 0; i < next; i++)
            {
                if (item.Equals(list[i]))
                {
                    list[i] = list[next - 1];  //Move last item to empty slot
                    next--;
                    break; //break because we only remove first
                }
            }

        }

        public void removeAll(ref int item)
        {
            //find value, if it exists
            for (int i = 0; i < next; i++)
            {
                if (item.Equals(list[i]))
                {
                    list[i] = list[next - 1];  //Move last item to empty slot
                    next--;
                }
            }
        }

        public int[] InsertionSort(ref int item)
        {
            //First we add the item
            insert(ref item);

            for (int i = 0; i < next - 2; i++)
            {
                for (int j = next - 1; j > i; j--)
                {
                    if (list[i] > list[j])
                    {
                        int temp = list[j];
                        list[j] = list[i];
                        list[i] = temp;
                    }
                }
            }
            return list;

        }

        public int Min()
        {
            if (next == 0) throw new Exception("No element is list, cannot get minimum");
            return list[0];
        }
        public int Max()
        {
            if (next == 0) throw new Exception("No element is list, cannot get maximun");
            return list[next - 1];
        }



        public void print()
        {
            for (int i = 0; i < next; i++)
            {
                Console.Write("{0} ", list[i]);
            }
            Console.WriteLine();
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            UnorderedArrayList u = new UnorderedArrayList();

            u.print();
            int var = 7;
            u.insert(ref var);
            var = 12;
            u.insert(ref var);
            var = 5;
            u.insert(ref var);
            var = 5;
            u.insert(ref var);
            var = 5;
            u.insert(ref var);
            var = 96;
            u.insert(ref var);
            u.print();
            var = 5;
            u.remove(ref var);
            u.print();
            u.InsertionSort(ref var);
            u.print();

        Console.WriteLine("Minimum of sortedlist is {0}", u.Min());
        Console.WriteLine("Maximum of sortedlist is {0}", u.Max());

        u.removeAll(ref var);
        u.print();
        Console.ReadKey();
        }
    }
}
...