Johdanto lajitteluun C #: ssä

Lajittelu c #: ssä on kokoelman sisällön järjestäminen tietyssä järjestyksessä. Kokoelma voi olla taulukko, luettelo tai mikä tahansa muu tietoryhmä. Kokoelma voi sisältää elementtejä sekä yksinkertaisista että monimutkaisista tyypeistä. Yksinkertainen tyyppi voi olla kokonaislukujen, merkkijonojen, liukulukujen jne. Kokoelma. Monimutkainen tyyppi voi olla kokoelma käyttäjän määrittelemiä tyyppejä, kuten työntekijä, opiskelija jne. Kompleksityypit ovat enemmän kuin usein sisäkkäisiä, mikä tarkoittaa objekteilla voi olla useita määritteitä.

esimerkit

  • Yksinkertainen tyyppi
    • Kokonaislukukeräys - (1, 2, 3, 4, 5)
    • Jousikokoelma - (“Mark", "Jamie", "Anna")
  • Monimutkainen tyyppi
    • ((Nimi: “Mark”, Työntekijän tunnus: “123”, Toimisto: “Lontoo”),
      (Nimi: “Jane”, työntekijän tunnus: “456”, toimisto: “NY”),
      (Nimi: “Annie”, Työntekijän tunnus: “789”, Toimisto: “Sydney”))

C # on tarjonnut sisäänrakennettuja menetelmiä kokoelmien lajitteluun. Olipa kyseessä taulukko, luettelo tai mikä tahansa yleinen kokoelma, C # Sort () -menetelmä voi lajitella sen mukana toimitetun vertailijan perusteella. Sisäisesti .Net-toteutus käyttää Quicksort-algoritmia lajittelemaan kokoelmat C #: ssä. Keskustelemme lisää tästä artikkelin seuraavissa osissa.

Kuinka lajittelu suoritetaan C #: ssä?

Kuten aiemmin todettiin, .Net-kehys käyttää Quicksort-lähestymistapaa C # -kokoelman elementtien lajitteluun. Joten, mitä quicksort on?

Quicksort noudattaa jakamis- ja valloitusstrategiaa. Tämä tarkoittaa, että lajittelualgoritmi valitsee nivel-elementin ja jakaa taulukon nivel-elementin perusteella. Nivelosaa pienemmät elementit asetetaan sen eteen. Niveltapaa suuremmat elementit sijoitetaan sen jälkeen. Tämä varmistaa, että nivelosa on lajiteltu. Lisäksi taulukko on jaettu kahteen osaan, jotka ovat pienempiä kuin nivel, ja elementeihin, jotka ovat suurempia kuin nivel. Seuraavaksi algoritmi noudattaa samaa lähestymistapaa molemmissa matriiseissa.

Alla on esimerkki tästä.

Lajittelematon ryhmä - 18, 5, 16, 23, 50, 32

Vaihe 1 (nivel = 32) - 18, 5, 16, 23, 32, 50

Vaihe 2a
Lajittelematon ryhmä - 18, 5, 16, 23
Kääntö = 23
Osittain lajiteltu taulukko - 18, 5, 16, 23

Vaihe 2b
Lajittelematon ryhmä - 50
Kääntö = 50
Osittain lajiteltu taulukko - 50

Vaihe 3a
Lajittelematon ryhmä - 18, 5, 16
Pivot = 16
Osittain lajiteltu taulukko - 5, 16, 18

Lajiteltu ryhmä - 5, 16, 18, 23, 32, 50

Siksi Quicksortilla on kaksi avainprosessia - nivelvalinta ja osion jakaminen taulukkoon. Algoritmin toteutukset riippuvat nivelvalinnasta. Se voi olla joko ensimmäinen elementti tai viimeinen tai mikä tahansa satunnainen elementti tai taulukon mediaani. Kun osio on valmis ja nivel on sijoitettu oikeaan asentoon, algoritmia kutsutaan rekursiivisesti osioiduille ryhmille, kunnes jokainen elementti on lajiteltu.

Kun lajittelu tehdään C #: ssä, tulee käsitteen vakaa ja epävakaa Quicksort. Vakaassa Quicksort-tilassa, jos kaksi elementtiä on yhtä suuret, niiden järjestys alkuperäisestä taulukosta säilyy. Muuten se on epävakaassa nopeusluokassa. C # toteutus käyttää epävakaa Quicksort.

Tyypit lajittelu C #

Tässä artikkelin osassa keskitymme pääasiassa kahden tyyppisiin kokoelmiin C # -ryhmissä ja -luetteloissa. Haluaisimme syvästi miettiä, kuinka C # lajittelee taulukot ja luettelot. Seuraavassa osassa yritetään selittää se muutamilla esimerkeillä.

1. Matriisin lajittelu C #: ssa

Tarkastellaan erilaisia ​​tapoja lajitella taulukko C #: ssa.

a. Oletusvertailijan käyttäminen

Tämä on oletuslajittelu () -menetelmä. Jos yhtään vertailijaa ei välitetä nimenomaisesti menetelmälle, C # käyttää nousevaa järjestystä elementtien järjestämiseen.

Koodi:

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

lähtö:

b. Custom Comparer -sovelluksen käyttäminen

Voimme tarjota myös oman mukautetun vertailijan lajittelu () -menetelmään. Tämä antaisi C # -kääntäjälle käyttämään mukautettua vertailijaa oletusarvon sijaan.

Muokatun vertailun luomiseksi meidän on otettava käyttöön Vertaa () -menetelmä IComparer-käyttöliittymästä. Alla oleva koodi osoittaa, kuinka luodaan vertailija, joka lajittelee elementit alenevassa järjestyksessä.

Luimme luokan, perimme sen IComparer-käyttöliittymältä, otimme käyttöön Vertaa () -menetelmän ja ohitsimme sen elementtien vertailuun laskevassa järjestyksessä.

Koodi:

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

lähtö:

C. Avain-arvo-parien käyttö

C # tarjoaa myös tavan lajitella yksi matriisi käyttämällä toisen matriisin avainarvoja. Alla olevassa esimerkissä on avain-arvopareja ihmisten etunimiä ja sukunimiä. Lajittelemme ne sekä etunimen että sukunimen mukaan käyttäen Lajittelu () -menetelmää.

Koodi:

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

lähtö:

2. Luettelon lajittelu C #: ssa

Katsokaamme erilaisia ​​tapoja lajitella luettelo C #: ssa.

Huomaa - Jos haluat käyttää C # -luetteloita, mukaan lukien kirjasto System.Collections.Generic.

a. Oletusvertailijan käyttäminen

Tämä on oletuslajittelu () -menetelmä. jos vertailijaa ei välitetä nimenomaisesti menetelmälle, c # käyttää nousevaa järjestystä elementtien järjestämiseen.

Koodi:

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

lähtö:

b. Custom Comparer -sovelluksen käyttäminen

Voimme myös tarjota oman räätälöidyn vertailijan lajittelu () -menetelmään. Tämä kehottaisi c # -kääntäjää käyttämään mukautettua vertailijaa oletusarvon sijaan.

Muokatun vertailun luomiseksi meidän on otettava käyttöön Vertaa () -menetelmä IComparer-käyttöliittymästä. Alla oleva koodi osoittaa, kuinka luodaan vertailija, joka lajittelee elementit alenevassa järjestyksessä.

Luimme luokan, perimme sen IComparer-käyttöliittymältä, otimme käyttöön Vertaa () -menetelmän ja ohitsimme sen elementtien vertailuun laskevassa järjestyksessä.

Koodi:

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

lähtö:

Monimutkaisten luettelotyyppien lajittelu

Monimutkaiset luettelotyypit ovat käyttäjän määrittelemiä luetteloita. Tarkemmin sanottuna ne ovat luetteloita käyttäjän määrittelemistä luokista. Käyttäjän määrittelemät objektit ovat sekoitus erilaisia ​​primitiivityyppejä. Monimutkaisen luettelotyypin lajittelu on vaikeaa. C # -kääntäjä odottaa kunkin kompleksiluokan periytyvän IComparable-käyttöliittymästä ja määrittelevän menetelmän CompareTo (). Tämä menetelmä sisältää ohjeet luettelon elementtien vertaamiseksi lajittelua varten.

Oheisessa esimerkissä määrittelemme käyttäjän määrittelemän työntekijäluokan ja lajittelemme työntekijäobjektit heidän tunnustensa perusteella.

Esimerkki # 1

Koodi:

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

lähtö:

Nyt mieleen tulee selvä kysymys, että entä jos haluamme lajitella Työntekijäluokan kohteet jonkin muun omaisuuden perusteella? Tämä on mahdollista. Meidän olisi otettava käyttöön IComparer-käyttöliittymä. Katsokaamme alla olevaa esimerkkiä ymmärtääksemme.

Esimerkki 2

Koodi:

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

lähtö:

johtopäätös

Joten tässä artikkelissa käsiteltiin perusteellisesti kokoelmien lajittelua C #: ssä. Keskityimme pääosin ryhmiin ja luetteloihin, koska nämä kaksi kattavat myös kaikki alkeelliset tyypit. Kun C # -lajittelun käsite on ymmärretty hyvin, siitä tulee helppo toteuttaa lajittelu muissa kokoelmissa, kuten luetteloissa, sanakirjoissa jne. Tämän artikkelin valmistuttua suositellaan tutkimaan MSDN-dokumentaatiota, jotta C-lajittelussa käytettäviä lajitteluratkaisuja voidaan toteuttaa lisää.

Suositellut artikkelit

Tämä on opas lajitteluun C #: ssä. Tässä keskustellaan lajittelun suorituskyvystä, lajittelutyypeistä, kuten taulukko ja luettelo, sekä esimerkkejä ja koodin toteutustapa. Voit myös katsoa seuraavia artikkeleita saadaksesi lisätietoja -

  1. Objektit C #: ssä
  2. Pääsy muokkaimiin C #: ssä
  3. Kuplalajittelu Java
  4. Osoittimet C #
  5. Lajittelu Pythonissa
  6. Kielisarja JavaScriptinä
  7. Vertailukelpoinen Java-esimerkissä | Kokoelman käyttöliittymä Java
  8. Merkkijonojen taulukko C-toiminnolla
  9. Eri esimerkkejä kokoelmista C #: ssä