Увод у сортирање у Ц #

Разврставање у ц # је процес слагања садржаја колекције по одређеном редоследу. Колекција може бити низ, листа или било која друга група података. Колекција може садржавати елементе једноставних типова као и сложених типова. Једноставни тип може бити колекција целих бројева, низова, бројева с помичном тачком итд. Сложен тип може бити колекција објеката дефинисаних од стране корисника типа, као што су Емплоиее, Студент, итд. Сложени типови су више него често угнијежђени, што значи објекти могу имати више атрибута.

Примери

  • Симпле Типе
    • Цела колекција - (1, 2, 3, 4, 5)
    • Колекција низа - ("Марк", "Јамие", "Анна")
  • Комплексни тип
    • ((Назив: „Марк“, Ид запосленика: „123“, Канцеларија: „Лондон“),
      (Име: „Јане“, ИД запосленика: „456“, Канцеларија: „НИ“),
      (Име: „Анние“, ИД запосленика: „789“, Канцеларија: „Сиднеи“))

Ц # је обезбедио уграђене методе за сортирање колекција. Било да се ради о матрици, листи или било којој генеричкој колекцији, метода Ц # Сорт () може је сортирати на основу датог упоређивача. Интерно, .Нет имплементација користи алгоритам Куицксорт за сортирање колекција у Ц #. О томе ћемо више расправљати у наредним одељцима чланка.

Како се врши сортирање у Ц #?

Као што је раније речено, .Нет оквир користи Куицксорт приступ да би разврстао елементе у Ц # колекцији. Дакле, шта је брза болест?

Куицксорт следи стратегију поделе и освајања. То значи да алгоритам за сортирање бира елемент који се окреће и дели матрицу на основу елемента који се окреће. Елементи мањи од зглоба су постављени испред њега. Елементи већи од стожера су постављени након њега. Ово осигурава сортирање окретног елемента. Такође је низ подијељен на два елемента мања од стожера и елементе веће од стожера. Даље, алгоритам слиједи исти приступ за оба поља.

Илустрација овога може се видети испод.

Нортортирани низ - 18, 5, 16, 23, 50, 32

Корак 1 (Пивот = 32) - 18, 5, 16, 23, 32, 50

Корак 2а
Нортортирани низ - 18, 5, 16, 23
Пивот = 23
Дјеломично сортирани низ - 18, 5, 16, 23

Корак 2б
Нортортирани низ - 50
Пивот = 50
Дјеломично сортирани низ - 50

Корак 3а
Нортортирани низ - 18, 5, 16
Пивот = 16
Дјеломично сортирани низ - 5, 16, 18

Сортирани низ - 5, 16, 18, 23, 32, 50

Дакле, Куицксорт има два кључна процеса - избор окретног дела и поделу матрице. Имплементација алгоритма овиси о одабиру окретнице. То може бити или први елемент, или задњи, или било који случајни елемент, или средњи низ. Једном када је партиција завршена и стожер се постави у правилан положај, алгоритам се рекурзивно позива за партициониране низове, све док се сваки елемент не сортира.

Када се сортирање врши у Ц #, долази до концепта стабилног и нестабилног Куицксорт-а. У стабилном Куицксорт-у, ако су два елемента једнака, чува се њихов редослијед из првобитног низа. Иначе је у нестабилном бржем стању. Ц # имплементација користи нестабилни Куицксорт.

Врсте сортирања у Ц #

У овом одељку чланка фокусирали бисмо се углавном на две врсте колекција у Ц # - низовима и списковима. Дубоко бисмо заронили у томе како Ц # разврстава низове и наводи. Следећи одељак би покушао да објасни неким примерима.

1. Сортирање низа у Ц #

Погледајмо различите начине на које можемо сортирати низ у Ц #.

а. Коришћење подразумеваног упоређивача

Ово је подразумевана метода Сорт (). Ако ниједан извођач није изричито пренесен у методу, Ц # користи узлазни поредак за сређивање елемената.

Шифра:

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");
)
)
)

Излаз:

б. Коришћење прилагођеног упоређивача

Такође можемо пружити сопствени прилагођени Упоређивач за Сорт () методу. Ово би наредило Ц # преводилац да користи прилагођени упоређивач уместо подразумеваног.

Да бисмо креирали прилагођени упоређивач, морамо да применимо метод Упореди () из интерфејса ИЦомпарер. Доље приказани код показује како да направите компаратер који би елементе сортирао по силазном редоследу.

Направили смо класу, наследили је из интерфејса ИЦомпарер, применили метод Упореди () и надјачали га да бисмо упоређивали елементе у силазном редоследу.

Шифра:

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");
)
)
)

Излаз:

ц. Коришћење парова кључа и вредности

Ц # такође пружа начин сортирања једног низа користећи кључне вредности из другог низа. Следећи пример садржи парове кључа и вредности имена и презимена људи. Поредили бисмо их по именима и презименима методом Сорт ().

Шифра:

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. Сортирање листе у Ц #

Погледајмо различите начине на које можемо сортирати листу у Ц #.

Напомена - Да бисте користили листе у Ц #, укључујући библиотеку Систем.Цоллецтионс.Генериц.

а. Коришћење подразумеваног упоређивача

Ово је задана метода сорт (). ако ниједан упоређивач изричито није пренесен на методу, ц # користи узлазни поредак за сређивање елемената.

Шифра:

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");
)
)
)

Излаз:

б. Коришћење прилагођеног упоређивача

Такође можемо пружити сопствено прилагођено упоређивање са сорт () методом. Ово би наредило ц # преводилац да користи прилагођени упоређивач уместо подразумеваног.

Да бисмо креирали прилагођени упоређивач, морамо да применимо метод Упореди () из интерфејса ИЦомпарер. Доље приказани код показује како да направите компаратер који би елементе сортирао по силазном редоследу.

Направили смо класу, наследили је из интерфејса ИЦомпарер, применили метод Упореди () и надјачали га да бисмо упоређивали елементе у силазном редоследу.

Шифра:

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");
)
)
)

Излаз:

Сортирање сложених типова листа

Врсте сложених спискова су листе које дефинишу корисници. Да будемо прецизнији, то су спискови објеката класа које су дефинисали корисник. Будући да их корисници дефинишу, објекти су мешавина различитих примитивних типова. Тешко је сортирати сложени тип листе. Компајлер Ц # очекује да свака сложена класа наследи од ИЦомпарабле интерфејса и дефинише методу ЦомпареТо (). Ова метода садржи упутства о томе како упоредити елементе листе за поређење.

У примјеру у наставку дефинирамо корисничку класу запослених и сортирамо објекте запосленика на основу њихових ИД-ова.

Пример # 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);
)
)
)

Излаз:

Сада је очигледно питање које нам пада на памет да шта ако желимо сортирати објекте класе Емплоиее на основу неке друге својине? То је могуће. Требали бисмо имплементирати ИЦомпарер интерфејс. Погледајмо пример у наставку да бисмо разумели.

Пример бр. 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);
)
)
)

Излаз:

Закључак

Дакле, овај чланак је детаљно описао како сортирати колекције у Ц #. Ми смо се углавном фокусирали на Низове и Листе јер ове две покривају и све примитивне типове. Једном када се концепт Сортирање у Ц # врло добро разуме, постаје лако имплементирати сортирање у друге колекције, као што су набрајање, речници, итд. Након довршавања овог чланка, препоручује се истраживање МСДН документације за више примена Сортирања у Ц #.

Препоручени чланци

Ово је водич за сортирање у Ц #. Овде смо расправљали о перформансама сортирања, врстама сортирања као што су низ и листа заједно са примерима и имплементацијом кода. Такође можете погледати следеће чланке да бисте сазнали више -

  1. Објекти у Ц #
  2. Приступите модификаторима у Ц #
  3. Буббле Сорт у Јави
  4. Показивачи у Ц #
  5. Разврставање у Питхон-у
  6. Стринг Арраи у ЈаваСцрипт-у
  7. Упоредиво у примеру Јава | Интерфејс колекције на Јави
  8. Низ низова у Ц са функцијама
  9. Различити примери колекција у Ц #

Категорија: