Radix Sort (Taban veya Basamağa Göre Sıralama) Algoritması

Selamün Aleyküm Arkadaşlar;

Radix sıralama algoritması ilk önce birler basamağındaki rakamı veya harfi karşılaştırıp bir sıralama yapar. Sonra o sıralamanın onlar basamağına göre tekrar dizilimini yapar. En fazla hangi basamaklı sayı varsa o basamağa kadar bu şekilde sıralama devam eder. Son basamak sıralamasında dizi sıralanmış olur.

Şöyle bir dizimiz olsun. Küçükten büyüğe doğru sıralayalım.

SnapCrab_No-0044

 

İlk önce birler basamağına göre sıralama yapılır.

SnapCrab_No-0045

 

Sonra onlar basamağına göre sıralama yapılır.

SnapCrab_No-0046

 

Sonra yüzler basamağına göre sıralama yapılır.

SnapCrab_No-0047

 

Son olarak en büyük sayı binler basamağında olduğu için binler basamağına göre sıralama yapılır.

SnapCrab_No-0048

 

Ve sonunda dizi sıralanmış olur.

Aslında her basamakta rakamlar arsındaki uzaklığa bakılır ve sıralama yapılır. Yani aslında basamaklar arasındaki rakamlara göre sayarak sıralama yapılır. Couting Sort (buradan bakabilirsiniz) sıralamasını kullanarak yazabiliriz. Sayı yerine rakamları sayacağımız için 0-9 uzunluğunda bir diziye ihtiyacımız var. Sayıları sayıp uzaklığına göre dizimize yerleştiririz. Tabiki bu son basamağa kadar tekrar edecektir. Dilerseniz while döngüsüyle veya recursive bir fonksiyonla yazabilirsiniz.

void Main()
{
int[] d = Radix_Sort(new int[]{1000, 32, 353, 21, 421});

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

Console.ReadKey();

}

int[] Radix_Sort(int[] dizi, int b = 1) {
    int[] a = new int[10];
    int[] c = new int[dizi.Length];

    int i = 0, ra = 0, p =  b * 10, k = 0;

    //Rakamlara göre say
    for (i = 0; i < dizi.Length; i++){
        ra = (dizi[i] % p) / b;

        //Kaçıncı basamağındaysa en büyük sayıyı al
        if(dizi[i] / p > k)
            k = dizi[i] / p;
        a[ra]++;
    }

    //n = n + (n - 1)
    for (i = 1; i < a.Length; i++){
        a[i] += a[i - 1];
    }

    //a daki indexlere göre sayıları sırala
    for (i = dizi.Length -1; i >= 0; i--){
        ra = (dizi[i] % p) / b;
        c[--a[ra]] = dizi[i];
    }

    //Sayı sıfırdan büyükse 
    if(k > 0)
        return Radix_Sort(c, p);
    return c;
}

Proje dosyasını buradan indirebilirsiniz.

 

PHP

$d = Radix_Sort(array(56, 1002, 24, 1, 256));

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

function Radix_Sort($dizi, $b = 1) {
    $a = array();
    $c = array();

    $i = 0; $ra = 0; $p =  $b * 10; $k = 0;

    //a dizisini 0'la
    for ($i=0; $i < 10; $i++) { 
    	$a[$i] = 0;
    }

    //Rakamlara göre say
    for ($i = 0; $i < count($dizi); $i++){
        $ra = intval(($dizi[$i] % $p) / $b);

        //Kaçıncı basamağındaysa en büyük sayıyı al
        if(intval($dizi[$i] / $p) > $k)
            $k = intval($dizi[$i] / $p);
        $a[$ra]++;
    }

    //n = n + (n - 1)
    for ($i = 1; $i < count($a); $i++){
        $a[$i] += $a[$i - 1];
    }

    //a daki indexlere göre sayıları sırala
    for ($i = count($dizi) - 1; $i >= 0; $i--){
        $ra = intval(($dizi[$i] % $p) / $b);
        $c[--$a[$ra]] = $dizi[$i];

    }

    //Sayı sıfırdan büyükse 
    if($k > 0)
        return Radix_Sort($c, $p);
    return $c;
}

 

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.