Вступ до сортування в C #

Сортування в c # - це процес упорядкування вмісту колекції у визначеному порядку. Колекція може представляти собою масив, список або будь-яку іншу групу даних. Колекція може містити елементи простих типів, а також складних типів. Простий тип може представляти собою сукупність цілих чисел, рядків, чисел з плаваючою комою тощо. Складним типом може бути сукупність об'єктів визначених користувачем типів, таких як Співробітник, Студент тощо. Складні типи частіше за все вкладаються, тобто об'єкти можуть мати кілька атрибутів.

Приклади

  • Простий тип
    • Колекція цілих чисел - (1, 2, 3, 4, 5)
    • Колекція рядків - ("Марк", "Джеймі", "Анна")
  • Комплексний тип
    • ((Прізвище: "Марк", Ідентифікатор працівника: "123", Офіс: "Лондон"),
      (Прізвище: "Джейн", ідентифікатор працівника: "456", офіс: "Нью-Йорк"),
      (Прізвище: "Енні", ідентифікатор працівника: "789", офіс: "Сідней"))

C # надав вбудовані методи сортування колекцій. Будь то масив, список або будь-яка загальна колекція, метод C # Sort () може сортувати його на основі наданого порівняльника. Внутрішня реалізація .Net використовує алгоритм Quicksort для сортування колекцій у C #. Детальніше про це ми поговоримо в наступних розділах статті.

Як сортування проводиться в C #?

Як було сказано раніше, .Net Framework використовує підхід Quicksort для сортування елементів у колекції C #. Отже, що таке кікспорт?

Quicksort дотримується стратегії розбиття і підкорення. Це означає, що алгоритм сортування вибирає зведений елемент і ділить масив на основі елемента зведення. Елементи, менші за шарнір, розміщуються перед ним. Елементи, розміри яких більше, ніж шарнір, розміщуються після нього. Це забезпечує сортування зведеного елемента. Також масив ділиться на два - елементи менші за зріз та елементи, що перевищують зрізний. Далі алгоритм дотримується однакового підходу для обох масивів.

Ілюстрацію цього можна побачити нижче.

Неортинований масив - 18, 5, 16, 23, 50, 32

Крок 1 (Зворотний = 32) - 18, 5, 16, 23, 32, 50

Крок 2а
Неортинований масив - 18, 5, 16, 23
Зворотний = 23
Частково відсортований масив - 18, 5, 16, 23

Крок 2b
Несортований масив - 50
Поворот = 50
Частково відсортований масив - 50

Крок 3а
Несортований масив - 18, 5, 16
Поворот = 16
Частково відсортований масив - 5, 16, 18

Відсортований масив - 5, 16, 18, 23, 32, 50

Таким чином, у Quicksort є два ключові процеси - вибір зведення і розділення масиву. Реалізація алгоритму залежить від вибору стрижня. Це може бути або перший елемент, або останній, або будь-який випадковий елемент, або медіана масиву. Після того, як розділ виконаний і зсув розміщений у потрібному положенні, алгоритм рекурсивно викликається для розділених масивів, поки кожен елемент не буде відсортований.

Коли сортування проводиться в C #, виникає концепція стабільного та нестабільного Quicksort. У стабільному Quicksort, якщо два елементи рівні, зберігається їх порядок від початкового масиву. Інакше він знаходиться в нестабільній швидкості. C # реалізація використовує нестабільний Quicksort.

Типи сортування в C #

У цьому розділі статті ми б зосереджувались головним чином на двох типах колекцій у C # - масиви та списки. Ми глибоко зануримось у те, як C # сортує масиви та списки. Наступний розділ спробує пояснити це кількома прикладами.

1. Сортування масиву в C #

Давайте розглянемо різні способи сортування масиву в C #.

а. Використання порівняльника за замовчуванням

Це метод Sort () за замовчуванням. Якщо жоден Порівняльник не передається явно методу, C # використовує порядку зростання для впорядкування елементів.

Код:

using System;
public class Program
(
public static void Main()
(
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
int() intArray = (23, 76, 12, 43, 90, 30);
Array.Sort(strArray);
Array.Sort(intArray);
Console.WriteLine("Sorted String Array:\n");
DisplayArray(strArray);
Console.WriteLine("\n\n\nSorted Integer Array:\n");
DisplayArray(intArray);
)
static void DisplayArray(string() arr)
(
foreach (string a in arr)
(
Console.Write(a + "\t");
)
)
static void DisplayArray(int() arr)
(
foreach (int a in arr)
(
Console.Write(a + "\t");
)
)
)

Вихід:

б. Використання користувацького порівняння

Ми також можемо надати власний власний порівняльник методу Sort (). Це дозволить компілятору C # використовувати користувацький порівняльник замість типового.

Для створення користувацького порівняння нам потрібно реалізувати метод Порівняння () з інтерфейсу IComparer. Код нижче демонструє, як створити компаратор, який би сортував елементи у порядку зменшення.

Ми створили клас, успадкували його від інтерфейсу IComparer, реалізували метод Порівняння () та замінили його для порівняння елементів у порядку зменшення.

Код:

using System;
public class DescendingComparer : System.Collections.IComparer
(
public int Compare(Object a, Object b)
(
return (new System.Collections.CaseInsensitiveComparer()).Compare(b, a);
)
)
public class Program
(
public static void Main()
(
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
int() intArray = (23, 76, 12, 43, 90, 30);
Array.Sort(strArray, new DescendingComparer());
Array.Sort(intArray, new DescendingComparer());
Console.WriteLine("Sorted String Array in Descending Order:\n");
DisplayArray(strArray);
Console.WriteLine("\n\n\nSorted Integer Array in Desc Order:\n");
DisplayArray(intArray);
)
static void DisplayArray(string() arr)
(
foreach (string a in arr)
(
Console.Write(a + "\t");
)
)
static void DisplayArray(int() arr)
(
foreach (int a in arr)
(
Console.Write(a + "\t");
)
)
)

Вихід:

c. Використання пар ключових значень

C # також забезпечує спосіб сортування одного масиву, використовуючи ключові значення з іншого масиву. Наведений нижче приклад містить пари ключових значень імен та прізвищ людей. Ми будемо сортувати їх за іменами та прізвищами методом Sort ().

Код:

using System;
public class Program
(
public static void Main()
(
String() firstNames = ("Tom", "Jack", "Anna", "Veronica", "Jessica", "Mike");
String() lastNames = ("Phelps", "Anderson", "Spectre", "Clarke", "Williams", "Fonseca");
Array.Sort(firstNames, lastNames);
Console.WriteLine("Sorted by First Names:\n");
DisplayArray(firstNames, lastNames);
Array.Sort(lastNames, firstNames);
Console.WriteLine("\n\nSorted by Last Names:\n");
DisplayArray(firstNames, lastNames);
)
static void DisplayArray(string() arr1, string() arr2)
(
for (int i = 0; i < arr1.Length; i++)
(
Console.WriteLine(arr1(i) + " " + arr2(i));
)
)
)

Вихід:

2. Сортування списку в C #

Давайте розглянемо різні способи сортування списку в C #.

Примітка. Використання списків у C #, включаючи бібліотеку System.Collections.Generic.

а. Використання порівняльника за замовчуванням

Це метод sort () за замовчуванням. якщо жоден порівняльник не передається явно методу, c # використовує порядку зростання для впорядкування елементів.

Код:

public class Program
using System.Collections.Generic;
(
public static void Main()
(
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
List strList = new List(strArray);
int() intArray = (23, 76, 12, 43, 90, 30);
List intList = new List(intArray);
strList.Sort();
intList.Sort();
Console.WriteLine("Sorted String List:\n");
DisplayList(strList);
Console.WriteLine("\n\n\nSorted Integer List:\n");
DisplayList(intList);
)
static void DisplayList(List myList)
(
foreach (string a in myList)
(
Console.Write(a + "\t");
)
)
static void DisplayList(List myList)
(
foreach (int a in myList)
(
Console.Write(a + "\t");
)
)
)

Вихід:

б. Використання користувацького порівняння

Ми також можемо надати власний власний порівняльний метод методу sort (). Це дозволить компілятору c # використовувати користувацький порівняльник замість типового.

Для створення користувацького порівняння нам потрібно реалізувати метод Порівняння () з інтерфейсу IComparer. Код нижче демонструє, як створити компаратор, який би сортував елементи у порядку зменшення.

Ми створили клас, успадкували його від інтерфейсу IComparer, реалізували метод Порівняння () та замінили його для порівняння елементів у порядку зменшення.

Код:

using System;
using System.Collections.Generic;
public class LengthComparer : IComparer
(
public int Compare(string a, string b)
(
return (a.Length.CompareTo(b.Length));
)
)
public class DigitSumComparer : IComparer
(
public int Compare(int a, int b)
(
int sum_a = 0;
int sum_b = 0;
while (a > 0)
(
sum_a += (a % 10);
a /= 10;
)
while (b > 0)
(
sum_b += (b % 10);
b /= 10;
)
return (sum_a.CompareTo(sum_b));
)
)
public class Program
(
public static void Main()
(
LengthComparer lc = new LengthComparer();
DigitSumComparer dsc = new DigitSumComparer();
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
List strList = new List(strArray);
int() intArray = (23, 76, 12, 43, 90, 30);
List intList = new List(intArray);
strList.Sort(lc);
intList.Sort(dsc);
Console.WriteLine("Sorted String List by Length:\n");
DisplayList(strList);
Console.WriteLine("\n\n\nSorted Integer List by Sum of Digits:\n");
DisplayList(intList);
)
static void DisplayList(List myList)
(
foreach (string a in myList)
(
Console.Write(a + "\t");
)
)
static void DisplayList(List myList)
(
foreach (int a in myList)
(
Console.Write(a + "\t");
)
)
)

Вихід:

Сортування типів складних списків

Типи складних списків - це визначені користувачем списки. Якщо точніше, це списки об'єктів визначених користувачем класів. Будучи визначеними користувачем, об'єкти - це суміш різних примітивних типів. Складно сортувати складний тип списку. Компілятор C # очікує, що кожен складний клас успадкує інтерфейс IComparable і визначить метод CompareTo (). Цей метод містить інструкції щодо порівняння елементів списку для сортування.

У наведеному нижче прикладі ми визначаємо визначений користувачем клас Співробітників і сортуємо об’єкти Співробітника на основі їх ідентифікаційних номерів.

Приклад №1

Код:

using System;
using System.Collections.Generic;
public class Employee : IComparable
(
public int id (get;set;)
public string name(get;set;)
public double salary(get;set;)
public int CompareTo(Employee e)
(
return this.id.CompareTo(e.id);
)
)
public class Program
(
public static void Main()
(
List emps = new List();
emps.Add(new Employee()
(id = 123, name = "Tom Phelps", salary = 20000.00));
emps.Add(new Employee()
(id = 897, name = "Jack Anderson", salary = 40050.50));
emps.Add(new Employee()
(id = 342, name = "Anna Spectre", salary = 31030.89));
emps.Add(new Employee()
(id = 219, name = "Veronica Clarke", salary = 66333.66));
emps.Add(new Employee()
(id = 642, name = "Jessica Williams", salary = 50505.05));
emps.Add(new Employee()
(id = 923, name = "Mike Fonseca", salary = 76543.21));
Console.WriteLine("Original Employee List:\n");
DisplayList(emps);
emps.Sort();
Console.WriteLine("\n\nSorted Employee List by IDs:\n");
DisplayList(emps);
)
static void DisplayList(List emp)
(
foreach (Employee e in emp)
(
Console.WriteLine("Id: " + e.id + ", Name: " + e.name + ", Salary: " + e.salary);
)
)
)

Вихід:

Тепер очевидним питанням, яке спадає на думку, є те, що робити, якщо ми хочемо сортувати об’єкти класу Employee на основі якоїсь іншої властивості? Це можливо. Нам потрібно реалізувати інтерфейс IComparer. Давайте подивимось на приклад нижче, щоб зрозуміти.

Приклад №2

Код:

using System;
using System.Collections.Generic;
public class Employee
(
public int id (get;set;)
public string name(get;set;)
public double salary(get;set;)
)
public class SortByName : IComparer
(
public int Compare(Employee e1, Employee e2)
(
return e1.name.CompareTo(e2.name);
)
)
public class SortBySalary : IComparer
(
public int Compare(Employee e1, Employee e2)
(
return e1.salary.CompareTo(e2.salary);
)
)
public class Program
(
public static void Main()
(
SortByName sbn = new SortByName();
SortBySalary sbs = new SortBySalary();
List emps = new List();
emps.Add(new Employee()
(id = 123, name = "Tom Phelps", salary = 20000.00));
emps.Add(new Employee()
(id = 897, name = "Jack Anderson", salary = 40050.50));
emps.Add(new Employee()
(id = 342, name = "Anna Spectre", salary = 31030.89));
emps.Add(new Employee()
(id = 219, name = "Veronica Clarke", salary = 66333.66));
emps.Add(new Employee()
(id = 642, name = "Jessica Williams", salary = 50505.05));
emps.Add(new Employee()
(id = 923, name = "Mike Fonseca", salary = 76543.21));
emps.Sort(sbn);
Console.WriteLine("Sorted Employee List by Names:\n");
DisplayList(emps);
emps.Sort(sbs);
Console.WriteLine("\n\nSorted Employee List by Salaries:\n");
DisplayList(emps);
)
static void DisplayList(List emp)
(
foreach (Employee e in emp)
(
Console.WriteLine("Id: " + e.id + ", Name: " + e.name + ", Salary: " + e.salary);
)
)
)

Вихід:

Висновок

Отже, ця стаття детально висвітлювала питання сортування колекцій у C #. Ми зосередили свою увагу на масивах та списках, оскільки вони охоплюють і всі примітивні типи. Після того, як концепція Сортування в C # дуже добре зрозуміла, стає легко реалізувати сортування в інших колекціях, таких як Перерахування, Словники тощо. Після заповнення цієї статті рекомендується вивчити документацію MSDN для більшої реалізації Сортування в C #.

Рекомендовані статті

Це посібник зі сортування в C #. Тут ми обговорюємо ефективність сортування, типи сортування, такі як масив та список разом із прикладами та реалізацією коду. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. Об'єкти в C #
  2. Модифікатори доступу в C #
  3. Сортування бульбашок на Java
  4. Покажчики в C #
  5. Сортування в Python
  6. String Array в JavaScript
  7. Порівняний у прикладі Java | Інтерфейс колекції на Java
  8. Масив рядків в C з функціями
  9. Різні приклади колекцій у C #