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.
Bu dizimizde 9 ve 19 arasında sayılar var. Arasındaki sayılar kadar güvercin yuvası oluşturuyoruz.
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.
Ş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.
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.



