Сортировка в visual studio

Обновлено: 07.07.2024

Содержание

  • Условие задачи
  • Выполнение
    • 1. Создание проекта. Классы SortSelection<T> и Program . Интерфейс IComparable<T>
    • 2. Разработка класса SortSelection<T>
      • 2.1. Ввод внутренних переменных класса
      • 2.2. Конструкторы класса
      • 2.3. Методы доступа Get() , Set()
      • 2.4. Метод Sort() . Сортировка всего массива. Метод CompareTo()
      • 2.5. Метод SortRange() . Сортировка массива в заданном диапазоне
      • 2.6. Метод Print() . Вывод массива

      Поиск на других ресурсах:

      Условие задачи

      Разработать обобщенный класс SortSelection<T> , который реализует алгоритм сортировки выбором. Продемонстрировать работу методов класса.

      Выполнение

      1. Создание проекта. Классы SortSelection<T> и Program . Интерфейс IComparable<T>
      • обобщенного класса SortSelection<T> , который есть решением данной задачи;
      • класса Program , в котором будет протестирована работа класса SortSelection<T> .

      Начальный код программы следующий

      Как видно из кода, класс SortSelection<T> реализует обобщенный интерфейс IComparable<T>

      Интерфейс обеспечивает так называемую типовую безопасность при сравнении значений некоторого обобщенного типа T . В интерфейсе объявлен метод CompareTo()

      который используется в нашей программе в методах Sort() и SortRange() (смотрите п.п. 2.5, 2.6) для сравнения двух значений некоторого типа T .
      Если не выполнить реализацию интерфейса IComparable<T> в классе SortSelection<T> и написать объявление класса следующим образом

      тогда невозможно будет сравнивать значение обобщенного типа T , и методы сортировки не удастся реализовать. В этом случае обычные операции сравнения <, >, == не обеспечивают типовой безопасности.

      2. Разработка класса SortSelection<T>
      2.1. Ввод внутренних переменных класса

      В классе SortSelection<T> в разделе private вводится внутренняя переменная A – массив обрабатываемых чисел.

      2.2. Конструкторы класса

      На этом этапе в текст класса SortSelection<T> вводятся три конструктора, инициализирующие внутренние данные класса (массив A ).

      2.3. Методы доступа Get() , Set()

      Для доступа к внутреннему массиву A необходимо реализовать соответствующие методы доступа Get() , Set() . Следует заметить, что в методах доступа используется копирование массива с использованием метода Clone() .

      Метод Clone() имеет следующие особенности:

      • метод выполняет копию массива с выделением памяти в другой области. Таким образом массив экземпляра A и внешний массив размещаются в разных участках памяти. Если вместо использования метода Clone() ( A=_A.Clone() ) использовать простое присваивание ссылок (например A = _A ), тогда внешний и внутренний массивы будут указывать на один и тот же участок памяти. Это может привести к невидимым ошибкам, если изменения во внешнем массиве будут влиять на внутренний (и наоборот), что есть нежелательно;
      • метод объявлен в классе System.Array , что есть базовым для всех массивов, объявленных в программе. Поэтому, этот метод доступен в программе.
      2.4. Метод Sort() . Сортировка всего массива. Метод CompareTo()

      Основным методом класса есть метод Sort() , в котором осуществляется сортировка всего массива. Особенность этого метода состоит в том, что для сравнения двух значений обобщенного типа T используется метод CompareTo() , который объявлен в интерфейсе IComparable<T> .

      Метод CompareTo() имеет следующее объявление:

      здесь other – экземпляр (объект) обобщенного типа T .

      Метод сравнивает текущий экземпляр с другим объектом такого же типа и возвращает целое число. Это число определяет, следует ли текущий экземпляр перед, после или находится в этой самой позиции в порядке сортировки в вравнении с объектом other . Если метод возвращает число <0, то значение текущего экземпляра следует перед значением объекта other (меньше). Если метод возвращает число ==0, то значения эквивалентны с точки зрения порядка сортировки. Если метод возвращает число >0, то значение текущего экземпляра следует после значения объекта other (больше).

      2.5. Метод SortRange() . Сортировка массива в заданном диапазоне

      Модификацией метода Sort() есть метод SortRange() , позволяющий отсортировать не весь массив, а его часть в указанном диапазоне.

      2.6. Метод Print() . Вывод массива

      Метод Print() выводит содержимое внутреннего массива A на экран. Метод используется с целью тестирования.

      3. Разработка класса Program

      Класс Program содержит статическую функцию main() , в которой продемонстрировано использование методов класса SortSelection<T> .

      4. Текст всей программы (сокращенная версия)

      После обработки всех предыдущих пунктов получается программа, сокращенный текст которой следующий.

      Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

      Описание алгоритма:

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

      Пример:

      Сортировка методом выбора проходит следующим образом.

      К примеру, у нас имеется массив 3 9 1 4 0

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

      Жирным шрифтом будет обозначаться нынешний минимальный элемент.

      3 9 1 4 0

      3 9 1 4 0

      Продолжаем сравнение. 1 меньше 4, но 0 меньше 1, значит теперь он считается минимальным элементом.

      3 9 1 4 0

      Мы прошли по массиву и нашли самый маленький его элемент.

      Теперь мы меняем местами этот элемент с элементом на нулевой позиции и больше не сравниваем его ни с чем (так как это бессмысленно и только занимает лишнее время), уменьшая количество шагов в итерации на 1.

      0 9 1 4 3

      Вторая итерация. Принимаем первый элемент среди оставшихся неупорядоченных чисел за минимальный и сравниваем его с остальными.

      0 9 1 4 3

      Единица меньше 9, теперь она минимальная.

      0 9 1 4 3

      Единица сравнивается с 4 и с 3, но все эти числа больше неё, следовательно, это и есть наш следующий минимальный элемент.

      Мы меняем его местами с элементом на первой позиции массива и опять сокращаем количество шагов в итерации на 1.

      0 1 9 4 3

      Третья итерация. Таким же образом ищем следующее минимальное число.

      0 1 9 4 3

      Четвёрка меньше девятки.

      0 1 9 4 3

      Тройка меньше четвёрки. Мы обошли весь массив, значит 3 и является минимальными значением. Меняем его местами с элементном на второй позиции массива.

      0 1 3 4 9

      Четвёртая итерация. Сравниваем оставшиеся числа. Нынешнее минимальное число 4 меньше, чем 9, значит оно остаётся на своём месте, а так как у нас после него остаётся последнее число 9 в массиве, то оно, соответственно, является максимальным из всего массива. Сортировка окончена.

      В предыдущем уроке мы реализовали страницы для совершения CRUD-операций для сущностей Student. В этом уроке мы добавим сортировку, фильтрацию и разбиение по страницам, а также создадим страницу, на которой будет простая группировка.

      На следующем изображении представлен окончательный вид страницы. Заголовки столбцов являются ссылками, реализующими сортировку по убыванию и возрастанию.

      image

      Добавление заголовков-сортировщиков в столбцы на странице Students Index

      Для добавления сортировки вам нужно изменить метод Index контроллера Student и добавить код на представление Student Index.

      Добавление сортировки в метод Index

      В Controllers\StudentController.cs замените метод Index на следующий код:

      При первом вызове страницы Index строки запроса нет, и студенты отображаются в порядке по возрастанию LastName, что указано как вариант по умолчанию в switch. После того, как пользователь щелкает на заголовке столбца, соответствующее значение sortOrder добавляется в строку запроса.

      The two ViewBag variables are used so that the view can configure the column heading hyperlinks with the appropriate query string values:


      Это тернарное утверждения. Первое утверждает, что, если sortOrder равен null или пустой, то значение ViewBag.NameSortParam устанавливается в “Name desc”, иначе устанавливается в пустую строку.

      • Если сортируется по возрастанию по LastName, ссылка LastName должна указывать на сортировку по убыванию по LastName и ссылка EnrollmentDate на сортировку по возрастанию по Date соответственно.
      • Если сортируется по убыванию по LastName, ссылки должны указывать на сортировку по возрастанию как по LastName так и по Date.
      • Если сортируется по возрастанию по Date, ссылки должны указывать на сортировку по возрастанию по LastName и по убыванию по Date.
      • Если сортируется по убыванию по Date, ссылки должны указывать на сортировку по возрастанию по LastName и по возрастанию по Date.

      Добавление заголовков-ссылок в Student Index

      В Views\Student\Index.cshtml замените код контейнеров<tr> и<th> следующим:


      В этом коде используется информация в свойствах ViewBag для заполнения ссылок подходящими значениями запроса. Запустите проект и щёлкните на заголовках, чтобы убедиться, что сортировка работает.

      image

      Добавление поиска

      Чтобы добавить фильтрацию, вы должны добавить на представление текстовое поле и кнопку отправки и сделать соответствующие изменения в коде метода Index.

      Изменение кода метода Index

      В Controllers\StudentController.cs замените код метода Index


      Мы добавили в метод Index параметр searchString, кляузу в LINQ-утверждение, с помощью которого выбираются только те студенты, имя или фамилия которых содержит строку поиска. Строка поиска получается из текстового поля, которое вы позже добавите на представление. Код, который добавляет кляузу where в запрос, выполняется только в том случае, если задано значение для поиска:

      Добавление поиска на представление

      В Views\Student\Index.cshtmlпрямо перед открывающим тегом table добавьте заголовок, текстовое поле и кнопку Search:


      Запустите проект, введите что-нибудь в строку поиска и нажмите на кнопку Search чтобы убедиться в работе фильтрации.

      image

      Добавление разбиения по страницам

      Для этого необходимо сначала установить NuGet-пакет PagedList, затем сделать изменения в методе Index и добавить на представление ссылки на страницы.

      image

      Установка NuGet-пакета NuGet Package

      NuGet-пакет PagedList устанавливает тип коллекции PagedList. Когда вы добавляете в коллекцию этого типа результаты запроса, вам предоставляется набор свойств и методов для обеспечения разбиения результатов по страницам.

      В Visual Studio выберите проект. Затем нажмите в меню Tools пунктLibrary Package Manager и потом Add Library Package Reference.

      В Add Library Package Reference нажмите на вкладку Online слева и введите в строку поиска "pagedlist". Как только появится пакет PagedList нажмите Install.

      image

      Добавление функциональности разбиения по страницам в метод Index

      В Controllers\StudentController.cs добавьте using PagedList:

      Замените код метода Index:


      Добавлен параметр page, несущий информацию о параметре, по которому в данный момент производится сортировка, и параметр в сигнатуре метода:

      public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)

      При первом вызове страницы (или если пользователь не нажал на одну из ссылок на страницы), переменная page равна null. После нажатия в эту переменную помещается номер страницы.

      Свойство ViewBag передаёт в представление текущий параметр сортировки для её сохранения при переходе на другие страницы:

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


      В конце метода запрос конвертируется вместо List в PagedList, после чего его можно передавать в представление, поддерживающее разбиение результатов по страницам.


      В метод ToPagedList передаётся значение индекса страницы, которое равно 0, в отличие от номера страницы, который равен 1. Поэтому код извлекает 1 из номера страницы, чтобы получить значения индекса страницы (два знака вопроса обозначают оператор, определяющий значение по умолчанию для типа nullable, таким образом, выражение (page ?? 1) возвращает значение page в том случае, если оно имеет значение, или 1, если page равен null. Другими словами, установите pageIndex в page — 1 если page не равен null, или установите его в 1-1 если он равен null)

      Добавление ссылок на страницы на представление

      В Views\Student\Index.cshtml замените исходный код на:


      Утверждение @model показывает, что представление принимает на вход объект типа PagedList вместо объекта типа List.

      Текстовая строка инициализируется текущей строкой поиска чтобы пользователь мог переходить со страницы на страницу не теряя строку поиска:

      Find by name: Html.TextBox("SearchString", ViewBag.CurrentFilter as string) &nbsp;

      Ссылки в заголовках столбцов используют строку запроса для передачи текущей строки поиска в контроллер, чтобы пользователь мог сортировать возвращённые механизмом фильтра результаты:

      В «подвале» страницы находится запись, демонстрирующая номер страницы и ссылки навигации:

      Page [current page number] of [total number of pages] << < Prev Next > >>

      << — ссылка на первую страницу, <Prev – ссылка на предыдущую страницу, и так далее. Если пользователь находится на странице с номером 1, ссылки на предыдущие страницы недоступны, и также для последней страницы. Каждая ссылка на страницу передаёт номер выбранной страницы и текущие данные о фильтрации и сортировки в контроллер в строке запроса, таким образом позволяя управлять этими данными в процессе разбиения на страницы.

      Если результатов нет, показывается надпись "Page 0 of 0".

      image

      Щелкните ссылки на страницы в различных режимах сортировки и введите какую-либо строку поиска, чтобы убедиться, что всё работает в связке.

      Создание страницы со статистикой

      • Создать класс с моделью представления для данных, которые мы будем передавать в представление
      • Изменить код метода About в контроллере Home.
      • Изменить код представления About.

      Создание модели представления

      Создайте папку ViewModels и в ней создайте файл EnrollmentDateGroup.cs со следующим содержанием:

      Изменение контроллера Home

      В HomeController.cs добавьте необходимые using:


      Добавьте переменную с контекстом базы данных:

      private SchoolContext db = new SchoolContext();

      Замените код метода About на:


      LINQ-утверждения группируют сущности студентов по дате записи, затем вычисляют количество сущностей в каждой группе и сохраняют результат в EnrollmentDateGroup.

      Случайная сортировка (Bogosort) – один из самых неэффективных алгоритмов сортировки массивов.

      Сортировка пузырьком

      Сортировка пузырьком (bubble sort) - один из самых простых для понимания методов сортировки массивов.

      Шейкерная сортировка

      Сортировка перемешиванием (cocktail sort, shaker sort), или шейкерная сортировка – это усовершенствованная разновидность сортировки пузырьком, при которой сортировка производиться в двух направлениях, меняя направление при каждом проходе.

      Сортировка вставками

      Сортировка вставками (insertion sort) - это алгоритм сортировка, в котором все элементы массива просматриваются поочередно, при этом каждый элемент размещается в соответственное место среди ранее упорядоченных значений.

      Сортировка по частям

      Сортировка по частям (Stooge sort) – рекурсивный алгоритм сортировки массива.

      Блинная сортировка

      Блинная сортировка (pancake sort) – алгоритм сортировки массива, в котором сортировка осуществляется переворотом части массива.

      Сортировка Шелла

      Сортировка Шелла (Shell sort) – алгоритм сортировки массива, который является обобщением сортировки вставками.

      Сортировка слиянием

      Сортировка слиянием (Merge sort) – алгоритм сортировки массива, который реализован по принципу “разделяй и властвуй”. Задача сортировки массива разбивается на несколько подзадач сортировки массивов меньшего размера, после выполнения которых, результат комбинируется, что и приводит к решению начальной задачи.

      Сортировка выбором

      Сортировка выбором (Selection sort) – алгоритм сортировки массива, который по скорости выполнения сравним с сортировкой пузырьком.

      Быстрая сортировка

      Быстрая сортировка (quick sort), или сортировка Хоара – один из самых быстрых алгоритмов сортирования данных.

      Гномья сортировка

      Гномья сортировка (Gnome sort) – простой в реализации алгоритм сортировки массива, назван в честь садового гнома, который предположительно таким методом сортирует садовые горшки.

      Сортировка бинарным деревом

      Сортировка бинарным деревом (Tree sort) – алгоритм сортировки, который заключается в построении двоичного дерева поиска по ключам массива, с последующим построением результирующего массива упорядоченных элементов путем обхода дерева.

      Сортировка расческой

      Сортировка расчёской (Comb sort) – алгоритм сортировки массива, является улучшенным вариантом сортировки пузырьком, при этом, по скорости выполнения, конкурирует с алгоритмом быстрой сортировки.

      Сортировка подсчетом

      Сортировка подсчетом (Counting sort) – алгоритм сортировки, который применяется при небольшом количестве разных значений элементов массива данных.

      Проверка упорядоченности массива

      Для проверки упорядоченности элементов массива можно использовать несколько методов. Рассмотрим самые распространенные из них.

      Читайте также: