Uvod u sortiranje u C #

Razvrstavanje u c # postupak je uređenja sadržaja zbirke u određenom redoslijedu. Zbirka može biti niz, popis ili bilo koja druga skupina podataka. Zbirka može sadržavati elemente jednostavnih tipova kao i složenih tipova. Jednostavan tip može biti kolekcija cjelobrojnih brojeva, nizova, brojeva s pomičnom zarezom itd. Složen tip može biti zbirka objekata definiranih od strane korisnika kao što su zaposlenik, student itd. Složeni tipovi su više nego često ugniježđeni, što znači objekti mogu imati više atributa.

Primjeri

  • Jednostavan tip
    • Kolekcija cijelih brojeva - (1, 2, 3, 4, 5)
    • Zbirka nizova - ("Mark", "Jamie", "Anna")
  • Složeni tip
    • ((Naziv: "Mark", ID zaposlenika: "123", ured: "London"),
      (Naziv: "Jane", ID zaposlenika: "456", Ured: "NY"),
      (Naziv: "Annie", ID zaposlenika: "789", ured: "Sydney"))

C # je osigurao ugrađene metode za razvrstavanje kolekcija. Bilo da se radi o matrici, popisu ili bilo kojoj generičkoj kolekciji, metoda C # Sort () može je razvrstati na temelju ponuđenog usporednika. Unutarnje, .Net implementacija koristi algoritam Quicksort za razvrstavanje kolekcija u C #. O tome ćemo više raspravljati u sljedećim odjeljcima članka.

Kako se vrši sortiranje u C #?

Kao što je ranije rečeno, .Net okvir koristi Quicksort pristup da bi razvrstao elemente u C # kolekciji. Dakle, što je quicksort?

Quicksort slijedi strategiju podjele i osvajanja. To znači da algoritam sortiranja odabire element za isticanje i dijeli niz na temelju elementa koji se okreće. Elementi manji od zgloba su postavljeni ispred njega. Elementi veće od stožera su postavljeni nakon njega. Ovo osigurava razvrstavanje elemenata za okret. Također je niz podijeljen na dva elementa manja od stožera i elemente veće od stožera. Dalje, algoritam slijedi isti pristup za oba niza.

Ilustracija toga može se vidjeti u nastavku.

Nortortirani niz - 18, 5, 16, 23, 50, 32

Korak 1 (stožer = 32) - 18, 5, 16, 23, 32, 50

Korak 2a
Nortorzirani niz - 18, 5, 16, 23
Pivot = 23
Djelomično razvrstani niz - 18, 5, 16, 23

Korak 2b
Nortorzirani niz - 50
Pivot = 50
Djelomično razvrstani niz - 50

Korak 3a
Nortortirani niz - 18, 5, 16
Pivot = 16
Djelomično razvrstani niz - 5, 16, 18

Poredani niz - 5, 16, 18, 23, 32, 50

Dakle, Quicksort ima dva ključna procesa - odabir okretnog dijela i podjelu matrice. Implementacija algoritma ovisi o odabiru okretnice. To može biti ili prvi element, ili zadnji, ili bilo koji slučajni element, ili srednji niz. Jednom kada je particija gotova i stožer se postavi u pravilan položaj, algoritam se rekurzivno poziva na particionirane nizove, dok se svaki element ne razvrsta.

Kada se razvrstavanje vrši u C #, dolazi koncept stabilnog i nestabilnog Quicksorta. U stabilnom Quicksort-u, ako su dva elementa jednaka, čuva se njihov redoslijed iz izvornog niza. Inače je u nestabilnom quicksortu. C # implementacija koristi nestabilni Quicksort.

Vrste sortiranja u C #

U ovom dijelu članka usredotočili bismo se uglavnom na dvije vrste zbirki u C # - nizovima i popisima. Duboko bismo zaronili u tome kako C # razvrstava nizove i popise. Sljedeći bi odjeljak pokušao objasniti s nekim primjerima.

1. Razvrstavanje niza u C #

Pogledajmo različite načine na koje možemo sortirati niz u C #.

a. Korištenje zadanog usporednika

Ovo je zadana metoda Sort (). Ako nije upotrijebljen izričito ni jedan Upoređivač, C # koristi poredajni poredak za slaganje elemenata.

Kodirati:

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

Izlaz:

b. Korištenje prilagođenog usporednika

Mi također možemo pružiti vlastiti prilagođeni usporednik prema Sort () metodi. Ovo bi upućivalo C # prevodilac da koristi prilagođeni komparator umjesto zadanog.

Da bismo stvorili prilagođenu usporednicu, moramo implementirati metodu Compare () iz sučelja IComparer. Donji kôd pokazuje kako stvoriti usporednik koji bi elemente sortirao prema silaznom redoslijedu.

Stvorili smo klasu, naslijedili je iz IComparer sučelja, primijenili metodu Uporedi () i nadjačali je da bismo usporedili elemente u silaznom redoslijedu.

Kodirati:

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

Izlaz:

c. Korištenje parova ključ-vrijednost

C # također pruža način sortiranja jednog polja koristeći ključne vrijednosti iz drugog niza. Primjer u nastavku sadrži parove ključa i vrijednosti imena i prezimena ljudi. Poredili bismo ih po imenima i prezimenima metodom Sort ().

Kodirati:

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

Izlaz:

2. Razvrstavanje popisa u C #

Pogledajmo različite načine na koje možemo sortirati popis u C #.

Napomena - Za upotrebu popisa u C #, uključujući knjižnicu System.Collections.Generic.

a. Korištenje zadanog usporednika

Ovo je zadana metoda sort (). ako nije upotrijebljen izričito upoređivač, c # upotrebljava uzlazni poredak za uređenje elemenata.

Kodirati:

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

Izlaz:

b. Korištenje prilagođenog usporednika

Također možemo pružiti vlastiti prilagođeni usporednik s metodom sort (). Ovo bi upućivalo sastavljač c # da koristi prilagođeni komparator umjesto zadanog.

Da bismo stvorili prilagođenu usporednicu, moramo implementirati metodu Compare () iz sučelja IComparer. Donji kôd pokazuje kako stvoriti usporednik koji bi elemente sortirao prema silaznom redoslijedu.

Stvorili smo klasu, naslijedili je iz IComparer sučelja, primijenili metodu Uporedi () i nadjačali je da bismo usporedili elemente u silaznom redoslijedu.

Kodirati:

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

Izlaz:

Razvrstavanje složenih vrsta popisa

Vrste složenih popisa su pojmovi koje definira korisnik. Da budemo precizniji, to su popisi objekata definiranih od strane korisnika. Budući da ih korisnici definiraju, objekti su mješavina različitih primitivnih tipova. Teško je sortirati složenu vrstu popisa. C # prevodilac očekuje da će svaka složena klasa naslijediti od IComparable sučelja i definirati metodu CompareTo (). Ova metoda sadrži upute za usporedbu elemenata popisa za razvrstavanje.

U primjeru u nastavku definiramo korisničku klasu zaposlenika i sortiramo objekte zaposlenika na temelju njihovih ID-ova.

Primjer 1

Kodirati:

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

Izlaz:

Očito pitanje koje nam pada na pamet jest da što ako želimo sortirati objekte klase zaposlenika na temelju nekog drugog svojstva? To je moguće. Trebamo implementirati IComparer sučelje. Pogledajmo primjer u nastavku kako bismo razumjeli.

Primjer 2

Kodirati:

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

Izlaz:

Zaključak

Dakle, ovaj je članak detaljno opisao kako sortirati kolekcije u C #. Uglavnom smo se fokusirali na Nizove i Liste jer ova dva pokrivaju i sve primitivne tipove. Jednom kada se koncept Sortiranje u C # vrlo dobro razumije, postaje lako implementirati sortiranje u druge zbirke kao što su nabrajanje, rječnici itd. Nakon dovršavanja ovog članka preporučuje se istražiti MSDN dokumentaciju za više implementacija Sortiranja u C #.

Preporučeni članci

Ovo je vodič za sortiranje u C #. Ovdje smo raspravljali o izvedbi sortiranja, vrstama sortiranja kao što su niz i popis zajedno s primjerima i implementacijom koda. Možete pogledati i sljedeće članke da biste saznali više -

  1. Objekti u C #
  2. Pristupi Modifikatorima u C #
  3. Bubble Sort u Javi
  4. Pokazivači u C #
  5. Razvrstavanje u Python
  6. Niz nizova u JavaScript-u
  7. Usporedivo u primjeru Java | Kolekcijsko sučelje u Javi
  8. Niz nizova u C s funkcijama
  9. Različiti primjeri zbirki u C #

Kategorija: