algorytm.org

Implementacja w C#



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Sortowanie przez scalanie (mergesort) - Implementacja w C#
Ocena użytkownikóww: *****  / 4
SłabyŚwietny
Nadesłany przez Krzysztof Sobol, 13 czerwca 2013 19:28
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

mergesort.cs:
    //Sortowanie przez scalanie (mergesort)
    //www.algorytm.org
    class Program
    {
        const int N = 100; //rozmiar tablicy do posortowania
        static int[] tablica = new int[N]; //tablica do posortowania
        static int[] tab = new int[N]; //tablica pomocnicza

        /// <summary>
        /// Scalanie tablic:
        /// pierwsza tablica ma indeksy od "pocz" do ("pocz" + "kon") / 2
        /// druga tablica ma indeksy od (("pocz" + "kon") / 2) + 1 do "kon"
        /// </summary>
        /// <param name="pocz">poczatek pierwszej tablicy</param>
        /// <param name="kon">koniec drugiej tablicy</param>
        static void scalanie(int pocz, int kon)
        {
            //Skopiuj wartosci do tablicy pomocniczej
            for (int i = pocz; i <= kon; i++)
            {
                tab[i] = tablica[i];
            }

            //Scalaj tablice
            int p = pocz;
            int q = (pocz + kon) / 2 + 1;
            int r = pocz;
            while (p <= (pocz + kon) / 2 && q <= kon)
            {
                if (tab[p] < tab[q])
                {
                    tablica[r] = tab[p];
                    r++;
                    p++;
                }
                else
                {
                    tablica[r] = tab[q];
                    r++;
                    q++;
                }
            }

            //Przepisz koncowke
            while (p <= (pocz + kon) / 2)
            {
                tablica[r] = tab[p];
                r++;
                p++;
            }
        }

        /// <summary>
        /// Sortowanie przez scalanie (mergesort)
        /// </summary>
        /// <param name="pocz">indeks poczatkowy tablicy do sortowania</param>
        /// <param name="kon">indeks koncowy tablicy do sortowania</param>
        static void sortowanie(int pocz, int kon)
        {
            if (pocz < kon)
            {
                //podziel sortowana tablice na pol
                sortowanie(pocz, (pocz + kon) / 2);
                sortowanie((pocz + kon) / 2 + 1, kon);
                //scal posortowane tablice
                scalanie(pocz, kon);
            }
        }

        /// <summary>
        /// Program
        /// </summary>
        static void Main()
        {
            //Wypelnij tablice losowymi wartosciami
            Random r = new Random();
            for (int i = 0; i < N; i++)
            {
                tablica[i] = r.Next(1001);
            }

            //Wypisz nie posortowana tablice
            for (int i = 0; i < N; i++)
            {
                Console.Write("{0} ", tablica[i]);
            }

            //Sortuj tablice uzywajac sortowania przez scalanie (mergesort)
            sortowanie(0, N - 1);

            //Wypisz posortowana tablice
            Console.WriteLine("\n");
            for (int i = 0; i < N; i++)
            {
                Console.Write("{0} ", tablica[i]);
            }
            Console.ReadLine();
        }
    }
Dodaj komentarz