Porządkowanie alfanumeryczne (porządkowanie leksykograficzne)
Algorytm porządkowania alfanumerycznego w swym działaniu wykorzystuje pozycję znaku sortowanego słowa w zbiorze kodów znaków. Zbiór kodu znaków w najbardziej zakrojonym przedziale to zbiór kodów ASCII, w którym na przykład pozycja znaku A (duża litera) to 65. Dla małej litery a to pozycja numer 97.
Takie podejście oznacza, że algorytm sortowania sprowadza kolejne znaki alfabetu do wartości liczbowych. Rozszerzając zbiór znaków na wiele alfabetów posługujemy się kodowaniem UTF-8 lub szerszym UTF-16, UTF-32. Rozszerzone kodowanie pozwala zapisać wszystkie znaki znanych alfabetów i jeszcze zostaje dużo niewykorzystanych indeksów.
Algorytm sortowania alfanumerycznego
Omawiane rozwiązanie algorytmu sortowania alfanumerycznego wykorzystuje klasę List opartą na elementach typu String. Klasa List ma wbudowaną opcję sortowania. Użycie tej opcji można rozszerzyć na rożne alfabety, co jest pokazane w kodzie funkcji sortującej. Graficzny schemat algorytmu porządkowania alfanumerycznego pokazuje poniższy rysunek
Kod funkcji sortującej od A do Z zapisany w języku C#
Wskazówka:
void wczytajDane_i_Sortuj_A_Z(List<String> lis,TextBox tb)
{
lis.Clear();
for (int i = 0; i < tb.Lines.Count(); i++)
lis.Add(tb.Lines[i]);
CultureInfo polska = new CultureInfo("pl-PL");
StringComparer kraj = StringComparer.Create(polska, true);
//sortuj od A - Z
lis.Sort(kraj);
}
Jeżeli chcemy przeprowadzić sortowanie odwrotne od Z do A to po posortowaniu od A do Z używamy funkcji Reverse() wbudowanej w klasie List
Kod funkcji sortującej od Z do A zapisany w języku C#
Wskazówka:
void wczytajDane_i_Sortuj_Z_A(List<String> lis, TextBox tb)
{
lis.Clear();
for (int i = 0; i < tb.Lines.Count(); i++)
lis.Add(tb.Lines[i]);
CultureInfo polska = new CultureInfo("pl-PL");
StringComparer kraj = StringComparer.Create(polska, true);
//sortuj od A - Z
lis.Sort(kraj);
//odwróć kierunek sortowania Z-A
lis.Reverse();
}
Tworzymy aplikację desktopową sortującą alfabetycznie
Na formatce umieszczamy komponenty kontrolek
- Panel- 1 sztuka
- Button- 2 sztuki (osadzone w kontrolce Panel)
- GroupBox- 2 sztuki
- TextBox- 2 sztuki (po jednej osadzamy w GroupBox)
Kontrolki TextBox powinny pracować w trybie wieloliniowym (Multiline). Patrz poniższy rysunek
Jedna z kontrolek TextBox będzie zawierać zbiór danych przeznaczony do sortowania. Dane w postaci kolejnych słów możemy wprowadzać z klawiatury lub w momencie tworzenia aplikacji zadać początkowy zbiór wejściowy w postaci kolekcji. Patrz poniżej
Kolejne słowa wprowadzamy w oknie dialogowym Edytor kolekcji ciągów
Działająca aplikacja sortująca alfanumerycznie
Widok na prostą aplikację sortującą alfanumerycznie od A do Z i od Z do A
Pełny kod klasy Form1.cs utworzonej aplikacji
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _22AlgSortowanieAlfabetyczne
{
public partial class Form1 : Form
{
List<String> lista = new List<String>();
void wczytajDane_i_Sortuj_A_Z(List<String> lis,TextBox tb)
{
lis.Clear();
for (int i = 0; i < tb.Lines.Count(); i++)
lis.Add(tb.Lines[i]);
CultureInfo polska = new CultureInfo("pl-PL");
StringComparer kraj = StringComparer.Create(polska, true);
//sortuj od A - Z
lis.Sort(kraj);
}
void wczytajDane_i_Sortuj_Z_A(List<String> lis, TextBox tb)
{
lis.Clear();
for (int i = 0; i < tb.Lines.Count(); i++)
lis.Add(tb.Lines[i]);
CultureInfo polska = new CultureInfo("pl-PL");
StringComparer kraj = StringComparer.Create(polska, true);
//sortuj od A - Z
lis.Sort(kraj);
//odwróć kierunek sortowania Z-A
lis.Reverse();
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
wczytajDane_i_Sortuj_A_Z(lista, textBox1);
textBox2.Clear();
//wypisz posortowane dane
foreach(String slowo in lista)
textBox2.AppendText(slowo+Environment.NewLine);
}
private void button2_Click(object sender, EventArgs e)
{
wczytajDane_i_Sortuj_Z_A(lista, textBox1);
textBox2.Clear();
//wypisz posortowane dane
foreach (String slowo in lista)
textBox2.AppendText(slowo + Environment.NewLine);
}
}
}