Pigeonhole Sort (Güvercin Yuvası Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Güvercin yuvası algoritması minimum ve maksimum sayılar arasındaki veriler için bir dizi oluşturup bu dizide sayıları sayıp, buna göre sıralama işlemi yapar. Pek kullanılmaz. Bunun sebebi sıralamanın hızlı şekilde nadiren oluşmasıdır.

Örnekle açıklayacak olursak eğer, şöyle bir dizimiz olsun.

SnapCrab_No-0049

Bu dizimizde 9 ve 19 arasında sayılar var. Arasındaki sayılar kadar güvercin yuvası oluşturuyoruz.

SnapCrab_No-0050

Sıfırıncı index dizideki minimum değeri, sonuncu index ise maksimum değeri temsil eder.

Şimdi A dizimizdeki sayılardan kaç tane varsa B dizimizde (+1 arttıralım) saydıralım.

SnapCrab_No-0051

 

Şimdi ise B dizisine baştan itibaren bakılır. hangi eleman 0’dan büyük ise o eleman sırasıyla diziye eklenir. Değeri -1 azaltılır. 0 olana kadar diziye eklenir. Sonra diğer elemanlara bakılır. Sonunda dizimiz sıralanmış olur.

 

SnapCrab_No-0053

void Main()
{
    int[] d = Pigeonhole_Sort(new int[] { 12, 16, 19, 10, 9});

    //Diziyi konsola yaz
    for (int i = 0; i < d.Length; i++){
        Console.Write(d[i] + " ");
    }

    Console.ReadKey();
}

int[] Pigeonhole_Sort(int[] Dizi)
{
    //Min ve max değerleri bul
    int min = Dizi[0], max = Dizi[0];
    foreach (int x in Dizi){
        min = Math.Min(x, min);
        max = Math.Max(x, max);
    }

    //Yuvaları tanımla
    int[] yuvalar = new int[max - min + 1];

    //Sayıları say
    foreach (int x in Dizi)
        yuvalar[x - min]++;

    //Diziyi Sırala
    int k = 0;
    for (int i = 0; i < yuvalar.Length; i++)
        while (yuvalar[i]-- > 0)
            Dizi[k++] = i + min;

    return Dizi;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$d = Pigeonhole_Sort(array(12, 16, 19, 10, 9));

//Diziyi ekrana yaz
for ($i = 0; $i < count($d); $i++){
    echo $d[$i] . ' ';
}

function Pigeonhole_Sort($Dizi)
{
    //Min ve max değerleri bul
    $min = $Dizi[0]; $max = $Dizi[0];
    foreach ($Dizi as $x){
        $min = min($x, $min);
        $max = max($x, $max);
    }

    //Yuvaları tanımla ve sıfırla
    $yuvalar = array();
    for ($i=0; $i < count(max - min + 1); $i++) { 
    	$yuvalar[$i] = 0;
    }

    //Sayıları say
    foreach ($Dizi as $x)
        $yuvalar[$x - $min]++;

    //Diziyi Sırala
    $k = 0;
    for ($i = 0; $i < count($yuvalar); $i++)
        while ($yuvalar[$i]-- > 0)
            $Dizi[$k++] = $i + $min;

    return $Dizi;
}

 

Hayırlı günler, sağlıcakla kalın.

Bu döküman www.ibasoglu.com’a aittir. Kaynak belirtmek suretiyle alıntı yapılabilir.