aFizyka logo

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

schemat algorytm sortowania alfanumerycznego Visual studio C#

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

Tworzymy aplikację desktopową sortującą alfabetycznie Visual studio C#

Kontrolki TextBox powinny pracować w trybie wieloliniowym (Multiline). Patrz poniższy rysunek

Kontrolki TextBox Visual studio C#

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

desktopową sortującą alfabetycznie kontrolki TextBox Visual studio C#

Kolejne słowa wprowadzamy w oknie dialogowym Edytor kolekcji ciągów

Edytor kolekcji ciągów Visual studio C#

Działająca aplikacja sortująca alfanumerycznie

Widok na prostą aplikację sortującą alfanumerycznie od A do Z i od Z do A

prosta aplikacja sortująca alfanumerycznie od A do Z i od Z do A Visual studio C#

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