Sissejuhatus sorteerimisse C # -s

C # -sse sortimine on kogu sisu kindlas järjekorras korraldamise protsess. Kogum võib olla massiiv, nimekiri või mõni muu andmerühm. Kollektsioon võib sisaldada nii lihtsate kui ka keerukate tüüpide elemente. Lihtsaks tüübiks võib olla täisarvude, stringide, ujukomade jne kogum. Kompleksne tüüp võib olla kasutaja määratletud tüüpide (nt töötaja, õpilane jne) objektide kogu. Komplekssed tüübid on rohkem kui sageli pesastatud, mis tähendab objektidel võib olla mitu atribuuti.

Näited

  • Lihtne tüüp
    • Terve arv - (1, 2, 3, 4, 5)
    • Keelpillikollektsioon - (“Mark”, "Jamie", "Anna")
  • Kompleksne tüüp
    • ((Nimi: “Mark”, töötaja ID: “123”, kontor: “London”),
      (Nimi: “Jane”, töötaja ID: “456”, kontor: “NY”),
      (Nimi: “Annie”, töötaja ID: “789”, kontor: “Sydney”))

C # on pakkunud sisseehitatud meetodeid kogude sortimiseks. Olgu tegemist massiivi, loendi või mõne muu üldkogumiga, C # Sorteerimise () meetodiga saab seda sortida vastavalt pakutavale võrdlusprogrammile. Sisemiselt kasutab .Net teos C # kollektsioonide sorteerimiseks Quicksorti algoritmi. Me räägime sellest lähemalt artikli järgmistes osades.

Kuidas sorteeritakse C # -s?

Nagu varem öeldud, kasutab .Net-raamistik C # kollektsiooni elementide sortimiseks Quicksort-lähenemist. Mis on kiirsort?

Quicksort järgib jagamise ja vallutamise strateegiat. See tähendab, et sortimisalgoritm valib pöördeelemendi ja jagab massiivi pöördeelemendi alusel. Pöördpunktist väiksemad elemendid asetatakse selle ette. Pöördtapist suuremad elemendid asetatakse pärast seda. See tagab pöördeelemendi sortimise. Samuti jaotatakse massiiv kaheks - pöördeosast väiksemad elemendid ja pöördeosast suuremad elemendid. Järgmisena järgib algoritm mõlema massiivi puhul sama lähenemisviisi.

Selle illustratsiooni saab näha allpool.

Sorteerimata massiiv - 18, 5, 16, 23, 50, 32

1. samm (pöördepunkt = 32) - 18, 5, 16, 23, 32, 50

Etapp 2a
Sorteerimata massiiv - 18, 5, 16, 23
Pivot = 23
Osaliselt sorteeritud massiiv - 18, 5, 16, 23

Etapp 2b
Sorteerimata massiiv - 50
Pivot = 50
Osaliselt sorteeritud massiiv - 50

3a samm
Sorteerimata massiiv - 18, 5, 16
Pivot = 16
Osaliselt sorteeritud massiiv - 5, 16, 18

Sorteeritud massiiv - 5, 16, 18, 23, 32, 50

Seega on Quicksortil kaks peamist protsessi - pöörde valimine ja massiivi jaotamine. Algoritmi rakendused sõltuvad pöörde valikust. See võib olla kas esimene element või viimane või suvaline element või massiivi mediaan. Kui partitsioon on tehtud ja pöördepunkt õiges asendis, kutsutakse algoritm rekursiivselt jaotatud massiive üles, kuni kõik elemendid on sorteeritud.

Kui sortimine toimub C # -s, siis on tegemist stabiilse ja ebastabiilse Quicksort-i mõistega. Stabiilses Quicksortis säilitatakse juhul, kui kaks elementi on võrdsed, nende järjekord algsest massiivist. Muidu on see ebastabiilses kiirkogumis. C # teostus kasutab ebastabiilset Quicksorti.

C-sorteerimise tüübid

Selle artikli jaotises keskendume peamiselt C # kahte tüüpi kollektsioonidele - massiivid ja nimekirjad. Me tahaksime sügavalt uurida, kuidas C # massiive ja loendeid sorteerib. Järgmine osa püüab seda selgitada mõne näitega.

1. Massiivi sortimine C # -s

Vaatame erinevaid viise, kuidas massiivi sorteerida C # -sse.

a. Vaikevõrdleja kasutamine

See on vaikimisi sortimise () meetod. Kui ühtki võrdlusmeetodit pole meetodile selgesõnaliselt üle antud, kasutab C # elementide järjestamiseks kasvavat järjekorda.

Kood:

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

Väljund:

b. Kohandatud võrdlusprogrammi kasutamine

Saame pakkuda ka oma kohandatud võrdlusmeetodit Sort (). See juhendaks C # kompilaatorit kasutama vaikimisi asemel kohandatud võrdlejat.

Kohandatud võrdleja loomiseks peame ICompareri liidesest rakendama võrdlusmeetodi (). Allolev kood näitab, kuidas luua võrdlus, mis sorteeriks elemendid kahanevas järjekorras.

Lõime klassi, pärandasime selle ICompareri liideselt, rakendasime Võrdle () meetodi ja alistasime selle elementide kahanevas järjekorras võrdlemiseks.

Kood:

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

Väljund:

c. Võtme-väärtuse paaride kasutamine

C # pakub ka viisi ühe massiivi sortimiseks, kasutades teise massiivi võtmeväärtusi. Allolevas näites on inimeste ees- ja perekonnanimede võtmeväärtuse paarid. Sorteerime need nii ees- kui ka perekonnanime järgi, kasutades meetodit Sort ().

Kood:

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

Väljund:

2. Loendi sortimine jaotises C #

Vaadakem erinevaid viise, kuidas C #-s loendit sortida.

Märkus - C # loendite kasutamiseks, sealhulgas teek System.Collections.Generic.

a. Vaikevõrdleja kasutamine

See on vaikimisi sortimise () meetod. kui meetodile pole selgesõnaliselt võrreldud, kasutab c # elementide järjestamiseks kasvavat järjekorda.

Kood:

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

Väljund:

b. Kohandatud võrdlusprogrammi kasutamine

Saame pakkuda ka oma kohandatud võrdlejat sortimismeetodi jaoks. See juhendaks c # kompilaatorit kasutama vaikimisi asemel kohandatud võrdlejat.

Kohandatud võrdleja loomiseks peame ICompareri liidesest rakendama võrdlusmeetodi (). Allolev kood näitab, kuidas luua võrdlus, mis sorteeriks elemendid kahanevas järjekorras.

Lõime klassi, pärandasime selle ICompareri liideselt, rakendasime Võrdle () meetodi ja alistasime selle elementide kahanevas järjekorras võrdlemiseks.

Kood:

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

Väljund:

Keerukate loenditüüpide sortimine

Kompleksloenditüübid on kasutaja määratletud loendid. Täpsemalt öeldes on need kasutaja määratletud klasside objektide loendid. Olles kasutaja määratletud, on objektid segu mitmesugustest primitiivsetest tüüpidest. Keerulist loenditüüpi on keeruline sorteerida. C # -kompilaator eeldab, et iga kompleksklass pärib IC-võrreldavast liidesest ja määratleb meetodi CompareTo (). See meetod sisaldab juhiseid loendi elementide sortimiseks võrdlemiseks.

Allolevas näites määratleme kasutaja määratletud töötajate klassi ja sorteerime töötajate objektid nende ID-de alusel.

Näide nr 1

Kood:

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

Väljund:

Nüüd tuleb ilmselgelt meelde tuletav küsimus, et mis saab siis, kui tahame töötajate klassi objekte sortida mõne muu vara põhjal? See on võimalik. Peaksime rakendama ICompareri liidese. Vaadakem mõistmiseks allpool toodud näidet.

Näide 2

Kood:

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

Väljund:

Järeldus

Niisiis, see artikkel käsitles põhjalikult, kuidas sorteerida kollektsioone C # -s. Keskendusime peamiselt massiividele ja loenditele, kuna need kaks hõlmavad ka kõiki primitiivseid tüüpe. Kui C #-s sortimise kontseptsioon on väga hästi mõistetav, muutub sorteerimine hõlpsaks ka teistes kogudes, näiteks loendites, sõnaraamatutes jne. Pärast selle artikli valmimist on soovitatav uurida MSDN-i dokumentatsiooni, et C-s sortimist rohkem rakendada.

Soovitatavad artiklid

See on juhend sorteerimiseks C # -sse. Siin käsitleme sortimise toimivust, sorteerimistüüpe, näiteks massiivi ja loendit, koos näidete ja koodi rakendamisega. Lisateabe saamiseks võite vaadata ka järgmisi artikleid -

  1. C-tüüpi objektid
  2. Juurdepääs modifikaatoritele C # -s
  3. Mullide sortimine Java-keeles
  4. Näpunäited C # -s
  5. Sorteerimine Pythonis
  6. Stringimassiiv JavaScriptis
  7. Võrreldav Java näites | Kogumisliides Java-s
  8. Stringide massiiv C funktsioonidega
  9. C # kollektsioonide erinevad näited

Kategooria: