4. C#

4.7. Seřazení prvků pole

Pro seřazení prvků v každém řádku matice vzestupně (přístup je obdobný, jako v případu jednorozměrného pole, kde každý řádek matice v podstatě představuje vektor) je v regionu Operace s polem, která je součástí regionu Pomocné metody, volána soukromá metoda bez návratu s názvem SeraditPole. V metodě jsou použit tři cykly. První cyklus s krokem slouží pro procházení řádků matice. U prvků v řádku matice totiž budeme znovu využívat pro třídění prvků v řádce algoritmus typu Bubble Sort, kde jsou porovnány jednotlivé dvojice sousedních prvků. Toto porovnání je prováděno ve třetím (druhém vnořeném) cyklu s krokem. Pokud je aktuálně procházený prvek větší než následující prvek, jsou tyto prvky vzájemně prohozeny. Pokud došlo alespoň k jednomu prohození sousedních prvků, celý vnitřní cyklus s krokem pro procházení od prvního do předposledního prvku je znovu opakován. Toto opakování zajistí druhý (vnořený) cyklus s podmínkou na konci. Pokud nedošlo k prohození ani v jedné porovnávané dvojici sousedních prvků není již cyklus s podmínkou na konci prováděn. Následující zdrojový kód obsahuje deklaraci metody SeraditPole - viz Kód 1.

/// <summary>
/// Metoda pro vzestupné třídění prvků v matici
/// </summary>
/// <param name="m"> počet řádků matice </param>
/// <param name="n"> počet sloupců matice </param>
/// <param name="pole"> matice </param>
private void SeraditPole(int m, int n, int[,] pole)
{
    /* Lokální proměnné: 'pom' ... pomocná proměnná pro dočasné uložení prvku; 'b' ... logická proměnná 
        * obsahující informaci, zda došlo k prohození některých sousedních prvků; 'i' ... index řádku 
        * matice; 'j' ... index sloupce matice */
    int pom;
    bool b;
 
    // Pro všechny řádky matice
    for (int i = 0; i < m; i++)
    {
        // Opakuj tak dlouho u každé řádky, dokud bude docházet k prohození prvků
        do
        {
            // Nedošlo k prohození sousedních prvků
            b = false;
            // Pro všechny sloupce matice
            for (int j = 0; j < n - 1; j++)
            {
                /* Pokud hodnota sousedícího prvku je větší než hodnota aktuálně testovaného 
                    * prvku, pak... */
                if (pole[i, j] > pole[i, j + 1])
                {
                    // Ulož hodnotu aktuálního prvku do pomocné proměnné
                    pom = pole[i, j];
 
                    // Ulož hodnotu sousedícího prvku do aktuálního prvku
                    pole[i, j] = pole[i, j + 1];
 
                    // Ulož hodnotu z pomocné proměnné do sousedícího prvku
                    pole[i, j + 1] = pom;
 
                    // Došlo k prohození sousedních prvků
                    b = true;
                }
            }
        }
        // Testování, zda došlo k prohození některých sousedních prvků
        while (b == true);
    }
}

Kód 1: Deklarace metody s návratem pro vzestupné seřazení prvků v jednotlivých řádcích matice (SeraditPole)

Přemístíme se zpět do regionu Události a jeho části Operace s polem. V tomto regionu upravíme metodu obsluhy události stisknutí tlačítka BtnSeradit - viz Kód 2. V rámci těla metody budeme volat předchozí deklarovanou metodu SeraditPole, které předáme tři parametry - počet řádků matice, počet sloupců matice a matici (uložené v datových složkách třídy). Vzhledem k tomu, že v metodě bude upravena matice, je vhodné tuto změněnou matici uživateli zobrazit. Proto matici zobrazíme jak do objektu typu TextBox, tak i do objektu typu ListView umístěných na formuláři. 

/// <summary>
/// Volání metody pro vzestupné třídění prvků v řádcích matice
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnSeradit_Click(object sender, RoutedEventArgs e)
{
    // Zavolání metody pro vzestupné třídění prvků v matici
    this.SeraditPole(this.pocetRadku, this.pocetSloupcu, this.pole);
    // Zavolání metody pro zobrazení matice do objektu (TextBox) na formuláři
    this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole);
    // Zavolání metody pro zobrazení matice v objektu (ListView) na formuláři
    this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole);
}

Kód 2: Deklarace metody pro zavolání metody vzestupného třídění v jednotlivých řádcích matice - výpis na formuláři (BtnSeradit_Click)