Class dizisini sıralama

Klasik tamsayı dizisini değil de, Ad ve Not bilgilerini bulunduran Ogrenci sınıfı dizisini nasıl sıralarsınız?

Bu örneğimizde, elimizde bulunan bir class dizisini sıralayacağız.

Internette bulunan çoğu sıralama örneği, hep tek boyutlu bir integer dizisi ile verilmektedir.

Örneğimizde, bir sınıfta bulunan öğrencilerin adlarını ve notlarını barındıran Ogrenci sınıfından oluşturulmuş bir dizi var elimizde ve bu diziyi not bilgisine göre küçükten büyüğe sıralamak istiyoruz.

Önce, Ogrenci sınıfımızı oluşturalım:

class Ogrenci
{
    string ad;
    int not;

    public Ogrenci() { }
    public Ogrenci(string ad, int not)
    {
        this.ad = ad;
        this.not = not;
    }

    public int Not
    {
        get { return not; }
        set { not = value; }
    }

    public string Ad
    {
        get { return ad; }
        set { ad = value; }
    }
}

        

Sıralama işini yapacak, Sıralama sınıfını gerçekleştirelim. Bu örneğimizde Hızlı Sıralama (Quick Sort) algoritmasını kullandım. Siz dilediğiniz algoritmayı kullanabilirsiniz. (bkz. SıralamaAlgoritmaları.com)

class HizliSiralama
{
    Ogrenci[] dizi;

    public HizliSiralama(Ogrenci[] dizi)
    {
        this.dizi = dizi;
    }

    public void Sirala()
    {
        Sirala(0, dizi.Length - 1);
    }

    void Degistir(int a, int b)
    {
        Ogrenci c = new Ogrenci();
        c.Ad = dizi[a].Ad;
        c.Not = dizi[a].Not;

        dizi[a].Ad = dizi[b].Ad;
        dizi[a].Not = dizi[b].Not;

        dizi[b].Ad = c.Ad;
        dizi[b].Not = c.Not;
    }
    public void Sirala(int sol, int sag)
    {
        int pivot, sol_, sag_;

        sol_ = sol;
        sag_ = sag;
        pivot = dizi[sol].Not;

        while (sol < sag)
        {
            while ((dizi[sag].Not >= pivot) && (sol < sag))
            {
                sag--;
            }

            if (sol != sag)
            {
                Degistir(sol, sag);
                //dizi[sol].Not = dizi[sag].Not;
                sol++;
            }

            while ((dizi[sol].Not <= pivot) && (sol < sag))
            {
                sol++;
            }

            if (sol != sag)
            {
                Degistir(sag, sol);
                //dizi[sag].Not = dizi[sol].Not;
                sag--;
            }
        }

        dizi[sol].Not = pivot;
        pivot = sol;
        sol = sol_;
        sag = sag_;

        if (sol < pivot)
        {
            Sirala(sol, pivot - 1);
        }

        if (sag > pivot)
        {
            Sirala(pivot + 1, sag);
        }
    }

    public void Yaz()
    {
        for (int i = 0; i < dizi.Length; i++)
        {
            Console.WriteLine("Adı: {0}, Notu: {1}",
                dizi[i].Ad, dizi[i].Not);
        }
    }
}
        
        

Degistir metoduna lütfen dikkat ediniz. Classlar referans tipindedir ve referans tiplerde
temp = a;
a = b;
b = temp;
yazamazsınız.

Şimdi bu sınıfları kullanarak ana kodumuzu gerçekleyelim:

Ogrenci[] ogr = new Ogrenci[5] // istenilen sayı kadar öğrenci tanımlanabilir.
{
    new Ogrenci("Ahmet",50),
    new Ogrenci("Mehmet",20),
    new Ogrenci("Ali",15),
    new Ogrenci("Veli",30),
    new Ogrenci("Deli",70),
};

HizliSiralama hs = new HizliSiralama(ogr);
Console.WriteLine("Sıralama Öncesi");
Console.WriteLine("=================");
hs.Yaz();
hs.Sirala();
Console.WriteLine();
Console.WriteLine("Sıralama sonrası");
Console.WriteLine("=================");
hs.Yaz();
    
        

Proje dosyasını buradan indirebilirsiniz.

Sormak istediğiniz bir soru olursa lütfen iletişime geçiniz.