Dvourozměrné pole - WPF
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)