Clear        


                
                    namespace _17_Demo_Sorting
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region Sayısal Bir Dizinin Bubble Sort Algoritması İle Sıralanması
            // Örnek sayısal veri kümesi: 4, 2, 3, 5, 1.
            // Örnek sayısal veri kümesi içindeki sayısal verileri
            // Bubble Sort Algoritması ile artan (küçükten büyüğe doğru) sıralama:

            decimal[] sayiKumesi = new decimal[] { 4, 2, 3, 5, 1 };

            decimal[] siralanmisSayiKumesi = BubbleSort(sayiKumesi);
            // BubbleSort methodunda params kullandığımızdan ihtiyaca göre methodu
            // BubbleSort(4, 2, 3, 5, 1) şeklinde istediğimiz kadar
            // parametre üzerinden de çağırabiliriz

            Console.WriteLine("Sayı kümesi:");
            foreach (decimal sayi in sayiKumesi)
            {
                Console.WriteLine(sayi);
            }
            // konsola alt alta 4, 2, 3, 5, 1 yazdırır

            Console.WriteLine("Bubble Sort ile artan sıralanmış sayı kümesi:");
            foreach (decimal siralanmisSayi in siralanmisSayiKumesi)
            {
                Console.WriteLine(siralanmisSayi);
            }
            // konsola alt alta 1, 2, 3, 4, 5 yazdırır
            #endregion



            #region Metinsel Bir Dizinin Bubble Sort Algoritması İle Sıralanması
            Console.WriteLine("\nMetin kümesi: Luna, Snoopy, angel, MAX, leo JR, lassie, lEo");

            string[] siralanmisMetinKumesi = BubbleSort("Luna", "Snoopy", "angel", "MAX", "leo JR", "lassie", "lEo");

            Console.WriteLine("Bubble Sort ile artan sıralanmış metin kümesi:");
            foreach (string siralanmisMetin in siralanmisMetinKumesi)
            {
                Console.WriteLine(siralanmisMetin);
            }
            // konsola alt alta angel, lassie, lEo, leo JR, Luna, MAX, Snoopy yazdırır
            #endregion



            #region Dizilerin Sort Methodu İle Sıralanması
            int[] sayiDizisi = new int[] { 1, 9, 2, 8, 3, 7, 4, 6, 5 };
            Console.Write("\nSayı dizisi: ");
            foreach (int sayiElemani in sayiDizisi) // konsola "Sayı dizisi: 1, 9, 2, 8, 3, 7, 4, 6, 5" yazdırır
            {
                Console.Write(sayiElemani + " ");
            }
            Array.Sort(sayiDizisi);
            Console.Write("\nSıralanmış sayı dizisi: ");
            foreach (int sayiElemani in sayiDizisi) // konsola "Sıralanmış sayı dizisi: 1, 2, 3, 4, 5, 6, 7, 8, 9" yazdırır
            {
                Console.Write(sayiElemani + " ");
            }

            string[] metinDizisi = { "a", "z", "B", "Y", "c" };
            Console.Write("\nMetin dizisi: ");
            foreach (string metinElemani in metinDizisi) // konsola "Metin dizisi: a, z, B, Y, c" yazdırır
            {
                Console.Write(metinElemani + " ");
            }
            Array.Sort(metinDizisi);
            Console.Write("\nSıralanmış metin dizisi: "); 
            foreach (string metinElemani in metinDizisi) // konsola "Sıralanmış metin dizisi: a, B, c, Y, z" yazdırır
            {
                Console.Write(metinElemani + " ");
            }
            #endregion
        }



        /// <summary>
        /// Bubble Sort Algoritması ile sayısal bir veri kümesi elemanlarının artan sıralanması.
        /// </summary>
        /// <param name="veriKumesi"></param>
        /// <returns>decimal[]</returns>
        static decimal[] BubbleSort(params decimal[] veriKumesi)
        {
            /*
            Örnek sayısal veri kümesi: 4, 2, 3, 5, 1.
            Örnek sayısal veri kümesi üzerinden algoritmanın açıklaması:
            Bubble Sort çalışmaya 4'ten başlar, 4 ile 2 karşılaştırılır ve 4 büyük olduğundan 2 ile yeri değiştirilir,
            sıra 3'e gelir, yeri değiştirilen 4 ile 3 karşılaştırılır ve 4 büyük olduğundan 3 ile yeri değiştirilir,
            sıra 5'e gelir, yeri değiştirilen 4 ile 5 karşılaştırılır ve 4 büyük olmadığından yer değiştirme işlemi yapılmaz,
            sıra 1'e gelir, 5 ile 1 karşılaştırılır ve 5 büyük olduğundan 1 ile yeri değiştirilir,
            sıra başa yani yeri değiştirilen 2'ye döner ve sıralama yukarıdaki şekilde devam eder.
            */

            decimal[] siralanmisVeriKumesi = veriKumesi.ToArray();
            // veriKumesi'ni siralanmisVeriKumesi'ne kopyalıyoruz ve sıralamayı siralanmisVeriKumesi
            // üzerinden yapıyoruz, eğer kopyalama işlemini yapmazsak parametre olarak gelen veriKumesi
            // referans olduğundan bu method içerisinde parametre üzerinde yapılan değişiklikler
            // methodun çağrıldığı yerdeki parametre olarak kullanılan değişkene yansır

            decimal gecici;
            bool degistirildiMi = true;

            for (int i = 1; i < siralanmisVeriKumesi.Length && degistirildiMi; i++)
            {
                degistirildiMi = false;
                for (int j = 0; j < siralanmisVeriKumesi.Length - 1; j++)
                {
                    if (siralanmisVeriKumesi[j] > siralanmisVeriKumesi[j + 1])
                    {
                        gecici = siralanmisVeriKumesi[j];
                        siralanmisVeriKumesi[j] = siralanmisVeriKumesi[j + 1];
                        siralanmisVeriKumesi[j + 1] = gecici;
                        degistirildiMi = true;
                    }
                }
            }

            return siralanmisVeriKumesi;
        }



        /// <summary>
        /// Bubble Sort Algoritması ile metinsel bir veri kümesi elemanlarının artan sıralanması.
        /// </summary>
        /// <param name="veriKumesi"></param>
        /// <returns>string[]</returns>
        static string[] BubbleSort(params string[] veriKumesi)
        {
            string[] siralanmisVeriKumesi = veriKumesi.ToArray();

            string gecici;
            bool degistirildiMi = true;

            for (int i = 1; i < siralanmisVeriKumesi.Length && degistirildiMi; i++)
            {
                degistirildiMi = false;
                for (int j = 0; j < siralanmisVeriKumesi.Length - 1; j++)
                {
                    // string.Compare methodu eğer parametre olarak gönderilen ilk string ikinci string'den sonra ise 0'dan büyük,
                    // önce ise 0'dan küçük, eşitse 0 döner, sırasıyla string'lerin karakterlerini karşılaştırır,
                    // StringComparison.CurrentCultureIgnoreCase parametresi ise bu methodda olduğu gibi bazı string methodlarında
                    // (Equals, Contains, vb.) büyük küçük harf duyarlılığını (case sensitivity) bilgisayarın bölgesel ayarına göre
                    // devre dışı bırakmak için kullanılabilir
                    if (string.Compare(siralanmisVeriKumesi[j], siralanmisVeriKumesi[j + 1], StringComparison.CurrentCultureIgnoreCase) > 0)
                    {
                        gecici = siralanmisVeriKumesi[j];
                        siralanmisVeriKumesi[j] = siralanmisVeriKumesi[j + 1];
                        siralanmisVeriKumesi[j + 1] = gecici;
                        degistirildiMi = true;
                    }
                }
            }

            return siralanmisVeriKumesi;
        }
    }
}