কম্পিউটার টিউটোরিয়াল

C প্রোগ্রামিং-এ রেডিক্স সর্ট (Radix Sort)

একটি সর্টিং অ্যালগরিদম (Sorting Algorithm) হল এমন একটি অ্যালগরিদম যা একটি লিস্টের কম্পোনেন্টগুলোকে একটি নির্দিষ্ট অর্ডারে সাজায়। সবচেয়ে ज्यादा ব্যবহৃত অর্ডারগুলো হল নümerিক্যাল অর্ডার (numerical order) এবং লেক্সিকোগ্রাফিক্যাল অর্ডার (lexicographic order)।

রেডিক্স সর্ট (Radix Sort) হল একটি নন-কম্পারেটিভ (non-comparative) সর্টিং অ্যালগরিদম। অনসর্টেড লিস্টের জন্য রেডিক্স সর্ট অ্যালগরিদম সবচেয়ে প্রিয় অ্যালগরিদম।

এটি এলিমেন্টগুলোকে শুরুতে একই প্লেস ভ্যালু (place value) দিয়ে আয়োজন করা ইনডিভিজুয়াল ডিজিট (individual digits) গ্রুপ করে সর্ট করে। রেডিক্স সর্টের আইডিয়া হলো ডিজিট বাই ডিজিট সর্ট করা লিস্ট সিগনিফিক্যান্ট ডিজিট (LSD) থেকে মোস্ট সিগনিফিক্যান্ট ডিজিট (MSD)-এর দিকে, তাদের বর্ধমান/হ্রাসমান ক্রম অনুযায়ী। রেডিক্স সর্ট একটি ছোট মেথড যা বড় নামের লিস্ট আলফাবেটিক্যালি সর্ট করার সময় অনেকবার ব্যবহার হয়।具體ভাবে, নামের লিস্টটি początkowo প্রতিটি নামের প্রথম অক্ষর অনুযায়ী সর্ট করা হয়, অর্থাৎ নামগুলো ছব্বিশটি ক্যাটাগরিতে সংগঠিত হয়।

নিচের উদাহরণটি দেখে রেডিক্স সর্ট অ্যালগরিদমের কাজ করার পদ্ধতি স্পষ্টভাবে বুঝতে পারবেন। স্পষ্টতই, পাস/ইটেরেশনের সংখ্যা সবচেয়ে বড় ইনডিভিজুয়াল নম্বরের সাইজের ওপর নির্ভর করে।

C প্রোগ্রামিং-এ রেডিক্স সর্ট (Radix Sort)

উপরের উদাহরণে, প্রথম কলামটি ইনপুট। বাকি কলামগুলো ক্রমশः সিগনিফিক্যান্ট ডিজিট পজিশনে সর্ট করার পরের লিস্ট দেখাচ্ছে।

রেডিক্স সর্টের কমপ্লেক্সিটি অ্যানালাইসিস: O(m.n)।

তবে, যদি আমরা এই দুটি মান দেখি, চাবি (keys) এর সাইজ তুলনামূলকভাবে ছোট চাবির সংখ্যার (number of keys) তুলনায়। উদাহরণস্বরূপ, যদি আমাদের ছয়-ডিজিট চাবি থাকে, তবে আমাদের ১,০০০,০০০টি আলাদা রেকর্ড থাকতে পারে। এখানে, আমরা দেখি যে চাবির সাইজ 별로 গুরুত্বপূর্ণ নয়, এবং এই অ্যালগরिदম লিনিয়ার কমপ্লেক্সিটি O(n) এর।

আলগরিদম (Algorithm)

Radix_sort(list, n)
shift = 1
for loop = 1 to keysize do
    for entry = 1 to n do
        bucketnumber = (list[entry].key / shift) mod 10
        append(bucket[bucketnumber], list[entry])
    list = combinebuckets()
    shift = shift * 10

উদাহরণ (C প্রোগ্রাম)

#include <stdio.h>

int get_max(int a[], int n) {
    int max = a[0];
    for (int i = 1; i < n; i++)
        if (a[i] > max)
            max = a[i];
    return max;
}

void radix_sort(int a[], int n) {
    int bucket[10][10], bucket_cnt[10];
    int i, j, k, r, NOP = 0, divisor = 1, lar, pass;

    lar = get_max(a, n);
    while (lar > 0) {
        NOP++;
        lar /= 10;
    }

    for (pass = 0; pass < NOP; pass++) {
        for (i = 0; i < 10; i++) {
            bucket_cnt[i] = 0;
        }
        for (i = 0; i < n; i++) {
            r = (a[i] / divisor) % 10;
            bucket[r][bucket_cnt[r]] = a[i];
            bucket_cnt[r] += 1;
        }
        i = 0;
        for (k = 0; k < 10; k++) {
            for (j = 0; j < bucket_cnt[k]; j++) {
                a[i] = bucket[k][j];
                i++;
            }
        }
        divisor *= 10;
        printf("After pass %d: ", pass + 1);
        for (i = 0; i < n; i++)
            printf("%d ", a[i]);
        printf("\n");
    }
}

int main() {
    int i, n, a[10];
    printf("Enter the number of items to be sorted: ");
    scanf("%d", &n);
    printf("Enter items: ");
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    radix_sort(a, n);
    printf("Sorted items: ");
    for (i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

আউটপুট

Enter number of items to be sorted: 6
Enter items: 567 789 121 212 563 562
After pass 1: 121 212 562 563 567 789
After pass 2: 212 121 562 563 567 789
After pass 3: 121 212 562 563 567 789
Sorted items: 121 212 562 563 567 789

ব্যাখ্যা: রেডিক্স সর্ট LSD (Least Significant Digit) থেকে MSD (Most Significant Digit) পর্যন্ত সর্ট করে। প্রতিটি পাসে ০-৯ পর্যন্ত ১০টি বাকেট (bucket) ব্যবহার করা হয়। এটি স্টেবল সর্ট (stable sort) এবং লিনিয়ার টাইম O(d*(n+b))-এ চলে (d = ডিজিট সংখ্যা, b = বেস/বাকেট সংখ্যা)।

  1. মার্জ সর্টের পাইথন প্রোগ্রাম

  2. হিপ সর্টের পাইথন প্রোগ্রাম

  3. ককটেইল সর্টের পাইথন প্রোগ্রাম

  4. পাইথন প্রোগ্রাম: সিলেকশন সোর্ট অ্যালগরিদম