Uvod v razvrščanje v C #

Razvrščanje v c # je postopek urejanja vsebine zbirke po določenem zaporedju. Zbirka je lahko niz, seznam ali katera koli druga podatkovna skupina. Zbirka lahko vsebuje tako elemente preprostih kot tudi zapletenih vrst. Preprost tip je lahko zbirka celih števil, nizov, številk s plavajočo vejico itd. Kompleksni tip je lahko zbirka predmetov uporabniško določenih vrst, kot so zaposleni, študent itd. Kompleksni tipi so več kot pogosto ugnezdeni, kar pomeni, predmeti imajo lahko več atributov.

Primeri

  • Enostavna vrsta
    • Zbir celih števil - (1, 2, 3, 4, 5)
    • Zbirka nizov - (“Mark”, “Jamie”, “Anna”)
  • Kompleksni tip
    • ((Ime: "Mark", ID zaposlenega: "123", Pisarna: "London"),
      (Ime: „Jane“, ID zaposlenega: „456“, Urad: „NY“),
      (Ime: „Annie“, id. Zaposlenega: „789“, pisarna: „Sydney“))

C # je zagotovil vgrajene metode za razvrščanje zbirk. Naj bo to matrika, seznam ali katera koli generična zbirka, način C # Sort () lahko razvrstite glede na ponujeni primerjalnik. Notranja izvedba .Net uporablja algoritem Quicksort za razvrščanje zbirk v C #. Več o tem bomo razpravljali v naslednjih razdelkih članka.

Kako se sortiranje izvaja v C #?

Kot smo že omenili, .Net okvir za razvrščanje elementov v zbirki C # uporablja pristop Quicksort. Torej, kaj je quicksort?

Quicksort sledi strategiji ločitve in osvajanja. To pomeni, da algoritem razvrščanja izbere vrtilni element in deli matriko na podlagi vrtilnega elementa. Pred njo so postavljeni elementi manjši od vrtišča. Elementi, večji od vrtenja, so nameščeni za njim. To zagotavlja, da je vrtilni element razvrščen. Niz je razdeljen na dva elementa, ki so manjši od vrtišča, in elemente, večje od vrtišča. Nato algoritem sledi enakemu pristopu za oba niza.

Ponazoritev tega si lahko ogledate spodaj.

Nortorted Array - 18, 5, 16, 23, 50, 32

1. korak (vrtenje = 32) - 18, 5, 16, 23, 32, 50

Korak 2a
Nortorted Array - 18, 5, 16, 23
Pivot = 23
Delno razvrščen niz - 18, 5, 16, 23

Korak 2b
Nortorted Array - 50
Pivot = 50
Delno razvrščeno polje - 50

Korak 3a
Nortorted Array - 18, 5, 16
Pivot = 16
Delno razvrščen niz - 5, 16, 18

Razvrščeni niz - 5, 16, 18, 23, 32, 50

Tako ima Quicksort dva ključna procesa - izbiro vrtišča in particijo matrike. Izvedbe algoritma so odvisne od izbire vrtišča. Lahko je bodisi prvi element, bodisi zadnji ali kateri koli naključni element ali mediana matrike. Ko je particija končana in je vrtilo postavljeno v pravi položaj, se algoritem rekurzivno prikliče za particionirane matrike, dokler ni vsak element razvrščen.

Ko se razvrščanje opravi v C #, pride do koncepta stabilnega in nestabilnega Quicksorta. Če sta dva elementa enaka, se ohrani vrstni red iz prvotnega niza. V nasprotnem primeru je v nestabilni hitrosti. C # izvedba uporablja nestabilen Quicksort.

Vrste razvrščanja v C #

V tem delu članka bi se osredotočili predvsem na dve vrsti zbirk v C # - Arrays in Lists. Poglobili bi se v to, kako C # razvršča matrike in sezname. Naslednji del bi to skušal razložiti z nekaj primeri.

1. Razvrstitev matrike v C #

Poglejmo različne načine, kako lahko razvrstimo niz v C #.

a. Uporaba privzetega primerjalca

To je privzeta metoda Sort (). Če nobena Primerjava ni izrecno posredovana metodi, C # uporablja razpored naraščajočega.

Koda:

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

Izhod:

b. Uporaba primerjalnika po meri

Prav tako lahko zagotovimo lastno Primerjavo po meri z metodo Sort (). To bi naročilo prevajalniku C #, naj uporabi primerjalnik po meri namesto privzetega.

Če želimo ustvariti primerjavo po meri, moramo iz vmesnika IComparer implementirati metodo Compare (). Spodnja koda prikazuje, kako ustvariti primerjalnik, ki bi elemente razvrstil po padajočem vrstnem redu.

Ustvarili smo razred, ga podedovali iz vmesnika IComparer, implementirali metodo Primerjava () in jo preglasili za primerjavo elementov v padajočem vrstnem redu.

Koda:

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

Izhod:

c. Uporaba parov ključ-vrednost

C # ponuja tudi način razvrščanja ene matrike z uporabo ključnih vrednosti iz drugega sklopa. Spodnji primer vsebuje pare imen in priimkov ljudi-ključa in vrednosti. Razvrstili bi jih po imenih in priimkih po metodi Sort ().

Koda:

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

Izhod:

2. Razvrščanje seznama v C #

Poglejmo različne načine, kako lahko seznam razvrstimo v C #.

Opomba - Če želite uporabljati sezname v C #, vključno s knjižnico System.Collections.Generic.

a. Uporaba privzetega primerjalca

To je privzeta metoda sort (). če nobena primerjava ni izrecno posredovana metodi, c # uporablja naraščajoči vrstni red za ureditev elementov.

Koda:

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

Izhod:

b. Uporaba primerjalnika po meri

Prav tako lahko zagotovimo lastno primerjavo po metodi sort (). To bi ukazal prevajalniku c #, da uporablja primerjalnik po meri namesto privzetega.

Če želimo ustvariti primerjavo po meri, moramo iz vmesnika IComparer implementirati metodo Compare (). Spodnja koda prikazuje, kako ustvariti primerjalnik, ki bi elemente razvrstil po padajočem vrstnem redu.

Ustvarili smo razred, ga podedovali iz vmesnika IComparer, implementirali metodo Primerjava () in jo preglasili za primerjavo elementov v padajočem vrstnem redu.

Koda:

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

Izhod:

Razvrščanje kompleksnih vrst seznamov

Vrste zapletenih seznamov so seznami, ki jih določi uporabnik. Natančneje, to so seznami predmetov uporabniško določenih razredov. Predmeti so uporabniško definirani in so mešanica različnih primitivnih vrst. Težko je razvrstiti zapleteno vrsto seznama. C # prevajalnik pričakuje, da bo vsak kompleksni razred podedoval od vmesnika IComparable in določil metodo CompareTo (). Ta metoda vsebuje navodila, kako primerjati elemente seznama za razvrščanje.

V spodnjem primeru definiramo uporabniško določen razred Zaposleni in razvrstimo predmete Zaposleni na podlagi njihovih ID-jev.

Primer # 1

Koda:

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

Izhod:

Zdaj je očitno vprašanje, ki se nam poraja, kaj, če želimo razvrstiti predmete razreda Employee na podlagi neke druge lastnosti? To je mogoče. Morali bi implementirati vmesnik IComparer. Za razumevanje si oglejmo spodnji primer.

Primer # 2

Koda:

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

Izhod:

Zaključek

Torej, ta članek je podrobno opisal, kako razvrstiti zbirke v C #. Osredotočili smo se predvsem na Niz in Sezname, saj ti dve zajemata tudi vse primitivne vrste. Ko je koncept razvrščanja v C # zelo dobro razumljen, postane enostavno razvrstiti razvrščanje v drugih zbirkah, kot so naštevanja, slovarji itd. Po končanem članku priporočamo, da preučite dokumentacijo MSDN za več izvedb razvrščanja v C #.

Priporočeni članki

To je vodnik za razvrščanje v C #. Tukaj razpravljamo o uspešnosti razvrščanja, vrstah razvrščanja, kot sta matrika in seznam, skupaj s primeri in implementacijo kode. Če želite izvedeti več, si oglejte tudi naslednje članke -

  1. Predmeti v C #
  2. Dostop do modifikatorjev v C #
  3. Bubble Sort v Javi
  4. Kazalci v C #
  5. Razvrščanje v Python-u
  6. Niz nizov v JavaScript
  7. Primerljivo v primeru Java | Zbirni vmesnik na Javi
  8. Niz nizov v C s funkcijami
  9. Različni primeri zbirk v C #