Radix Sort — müqayisəyə əsaslanmayan (non-comparative) sıralama alqoritmidir. Bu alqoritm elementləri rəqəmlərinə (yəni rəqəm mövqelərinə) görə bucket adlı qruplara bölərək işləyir. Əməliyyat ya ən az əhəmiyyətli rəqəmdən (LSD - least significant digit) başlayaraq, ya da ən çox əhəmiyyətli rəqəmdən (MSD - most significant digit) başlayaraq aparılır. Bu proses, bütün rəqəmlər nəzərə alınana qədər davam edir.
Radix Sort, xüsusilə tam ədədlərin sıralanmasında effektivdir və O(nk) (k = ən böyük rəqəm sayı) kimi xətti zaman mürəkkəbliyinə malikdir. Bu, onu böyük verilənlər üçün ənənəvi müqayisəyə əsaslanan sıralama alqoritmlərindən daha sürətli edir. Lakin bu alqoritm üçün bütün ədədlərin eyni sayda rəqəmə sahib olması və ya bərabərləşdirilməsi vacibdir.
İmplementasiya
getDigit
- Verilmiş ədədin istənilən rəqəmini almaq
Bu funksiya num
ədədinin i
-ci mövqedəki rəqəmini qaytarır:
const getDigit = (number, i) => {
return Math.floor(Math.abs(number) / Math.pow(10, i)) % 10;
}
digitCount
- Ədədin neçə rəqəmdən ibarət olduğunu qaytarmaq
Bu funksiya ədədin neçə rəqəmdən ibarət olduğunu tapır:
const digitCount = (number) => {
return Math.floor(Math.log10(Math.abs(number))) + 1;
}
mostDigits
- Massivdə ən çox rəqəmə sahib ədədin rəqəm sayını tapmaq
Bu funksiya bir massivdəki ən böyük rəqəm sayını tapır:
const mostDigits = (numberArray) => {
let max = 0;
for (let i = 0; i < numberArray.length; i++) {
max = Math.max(max, digitCount(numberArray[i]));
}
return max;
}
Radix Sort-un özünün tətbiqi
- Bir massiv qəbul edən
radixSort
funksiyasını yaradın; - Ən böyük ədədin neçə rəqəmə sahib olduğunu
mostDigits
funksiyası ilə tapın; k = 0
-dan başlayaraq bu ən böyük rəqəm sayına qədər dövr yaradın;- Hər iterasiyada:
digitBuckets
adlı 0-dan 9-a qədər 10 boş qutu yaradın;- Ədədləri
k
-cı rəqəmlərinə görə uyğun qutulara yerləşdirin;
- Massivi
bucket
-lərdəki dəyərlərlə yenidən qurun ([].concat(...digitBuckets)
); - Sonda sıralanmış massivi qaytarın;
Tam Həll:
const radixSort = (array) => {
const largest = mostDigits(array);
for (let k = 0; k < largest; k++) {
const digitBuckets = Array.from({ length: 10 }, () => []);
for (let i = 0; i < array.length; i++) {
const digit = getDigit(array[i], k);
digitBuckets[digit].push(array[i]);
}
array = [].concat(...digitBuckets);
}
return array;
}
Nəticə
Radix Sort — sadə, amma güclü bir alqoritmdir. Xüsusilə tam ədədlərlə işləyən və böyük verilənlərdə performans tələb edən sistemlərdə çox istifadə olunur. Əgər ədədlər eyni uzunluqda deyilsə, 0
ilə doldurularaq eyni uzunluğa gətirilə bilər. Radix Sort-un müqayisəyə əsaslanan sort alqoritmlərindən fərqli olaraq rəqəm əsaslı olması onu unikal və fərqli edir.