Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

فرز الأساس

آخر تحديث

فرز الأساس هو فرز بلا مقارنات للأعداد الصحيحة. فبدلًا من مقارنة القيم، يفرز الأرقام رقمًا برقم. تعالج نسخة الرقم الأقل أهمية (LSD) خانة الآحاد أولًا، ثم العشرات، ثم المئات، مستخدمةً فرز عدّ مستقرًّا عند كل رقم. ولأن كل تمريرة مستقرة، فإن المصفوفة كلها تصبح مرتّبة بمجرد معالجة الرقم الأكثر أهمية. اضغط تشغيل في الأعلى لتشاهد كيف تعيد كل تمريرة رقمية ترتيب الأعمدة.

يعمل فرز الأساس في زمن O(d·(n + k))، حيث d هو عدد الأرقام وk هو الأساس (10 هنا). وبالنسبة للأعداد الصحيحة ذات العرض الثابت يكون هذا خطيًّا فعليًّا - ويمكنه التفوق على فرز المقارنة بزمن O(n log n) - لكنه يعمل فقط على البيانات التي يمكن تفكيكها إلى أرقام أو مفاتيح.

التعقيد الزمني والمكاني

الحالةالتعقيدملاحظات
الزمنO(d·(n + k))d رقمًا، أساس k (خطي عند ثبات d)
المساحةO(n + k)مصفوفة الإخراج + عدّات الأرقام
مستقرنعمكل تمريرة رقمية هي فرز عدّ مستقر
قائم على المقارنة؟لايفرز حسب الرقم لا بمقارنة القيم
يعمل علىأعداد صحيحة/مفاتيحليس على الكائنات القابلة للمقارنة عمومًا

خطوة بخطوة

الخطوةما الذي يحدث
1إيجاد القيمة العظمى لمعرفة عدد الأرقام المطلوب معالجتها.
2البدء بالرقم الأقل أهمية (خانة الآحاد).
3فرز المصفوفة فرزًا مستقرًّا حسب ذلك الرقم باستخدام فرز العدّ.
4الانتقال إلى الرقم التالي الأكثر أهمية.
5التكرار حتى معالجة جميع مواضع الأرقام.

مثال محلول

فرز [170, 45, 75, 90, 2, 24, 66]:

التمريرةالمصفوفةالإجراء
البداية[170, 45, 75, 90, 2, 24, 66]القيمة العظمى هي 170، لذا يلزم ثلاث تمريرات رقمية.
الآحاد[170, 90, 2, 24, 45, 75, 66]فرز مستقر حسب خانة الآحاد: 0, 0, 2, 4, 5, 5, 6.
العشرات[2, 24, 45, 66, 170, 75, 90]فرز مستقر حسب خانة العشرات: 0, 2, 4, 6, 7, 7, 9 (يحتفظ 170 بتقدّمه على 75).
المئات[2, 24, 45, 66, 75, 90, 170]فرز مستقر حسب خانة المئات؛ 170 وحده يملك 1 فينتقل إلى الآخر. تمّ الفرز.

متى تستخدم فرز الأساس

استخدمه عندماتجنّبه عندما
تكون المفاتيح أعدادًا صحيحة أو سلاسل ثابتة الطول يمكن تقسيمها إلى أرقام.يجب عليك فرز كائنات عشوائية باستخدام مقارن مخصّص.
يكون عدد أرقام المفاتيح d صغيرًا ومحدودًا، بحيث يتفوق O(d·(n + k)) على O(n log n).تكون المفاتيح طويلة جدًّا أو غير محدودة، مما يجعل d كبيرًا والتمريرات مكلفة.
تحتاج إلى فرز مستقر ويمكنك تحمّل مساحة إضافية بمقدار O(n + k).تكون الذاكرة شحيحة وتكون مخازن O(n + k) غير مقبولة.
يكون مدى القيم أو الأساس k معتدلًا نسبةً إلى n.يكون k ضخمًا، بحيث تهيمن كل تمريرة فرز عدّ على زمن التنفيذ.

كود Radix Sort

تنفيذ نظيف وقابل للتشغيل لخوارزمية Radix Sort بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.

كود Radix Sort بلغة Python

Python
1def radix_sort(a):2    # Sort by each decimal digit, least significant first3    max_value = max(a)4    exp = 15    while max_value // exp > 0:6        a = sort_by_digit(a, exp)7        exp *= 108    return a9
10
11def sort_by_digit(a, exp):12    buckets = [[] for _ in range(10)]13    for value in a:14        digit = (value // exp) % 1015        buckets[digit].append(value)16    # Concatenating buckets 0..9 keeps the sort stable17    return [value for bucket in buckets for value in bucket]18
19
20nums = [170, 45, 75, 90, 802, 24, 2, 66]21print("Before:", nums)22print("After: ", radix_sort(nums))
شغّل هذا الكود في ساحة تجربة Python

أسئلة شائعة عن فرز الأساس

ما هو التعقيد الزمني لفرز الأساس؟
فرز الأساس هو O(d·(n + k))، حيث d هو عدد الأرقام وk هو الأساس. وبالنسبة للأعداد الصحيحة ذات العرض الثابت يكون هذا فعليًّا O(n)، وهو ما قد يكون أسرع من فرز المقارنة. ويستخدم مساحة إضافية بمقدار O(n + k).
هل فرز الأساس مستقر؟
نعم. يعتمد فرز الأساس LSD على فرز عدّ مستقر عند كل رقم؛ وهذا الاستقرار هو ما يجعل النهج القائم على الأرقام ينتج نتيجة مرتبة بشكل صحيح.
متى يمكنني استخدام فرز الأساس؟
يعمل فرز الأساس على البيانات التي يمكن تفكيكها إلى أرقام أو مفاتيح ثابتة الحجم، مثل الأعداد الصحيحة أو السلاسل ثابتة الطول. وهو ليس فرز مقارنة عام الغرض، لذا لا يمكنه فرز كائنات عشوائية باستخدام مقارن مخصّص.
كيف يختلف فرز الأساس عن فرز العدّ؟
يفرز فرز العدّ حسب مفتاح واحد في تمريرة واحدة ويحتاج إلى مصفوفة عدّ بحجم مدى القيم، لذا يتدهور أداؤه عندما تكون القيم متباعدة. أما فرز الأساس فيطبّق فرز العدّ رقمًا برقم، مبقيًا مصفوفة عدّ كل تمريرة صغيرة (الأساس k)، مما يمكّنه من التعامل مع مديات قيم كبيرة يعجز عنها فرز العدّ البسيط.
لماذا يبدأ فرز الأساس LSD بالرقم الأقل أهمية؟
يتيح البدء بالرقم الأقل أهمية لكل تمريرة مستقرة أن تحافظ على الترتيب الذي أرسته جميع الأرقام الأقل أهمية السابقة. وبحلول معالجة الرقم الأكثر أهمية تكون حالات التعادل في ذلك الرقم مرتّبة بالفعل بشكل صحيح حسب الأرقام الأدنى، فتنتهي المصفوفة مرتّبة تمامًا. أما الفرز أولًا حسب الرقم الأكثر أهمية فسيكسر ذلك ويتطلّب نهجًا تعاوديًّا مختلفًا (فرز الأساس MSD).
هل يستطيع فرز الأساس التعامل مع الأعداد السالبة؟
ليس مباشرةً - فاستخراج الأرقام الأساسي يفترض أعدادًا صحيحة غير سالبة. ومن الحلول الشائعة إزاحة جميع القيم بإضافة القيمة الدنيا بحيث تصبح كلها غير سالبة، أو فرز السالبة وغير السالبة على حدة ثم دمجها. وتجاهل ذلك خطأ متكرر عند تطبيق فرز الأساس على بيانات حقيقية.
Coddy programming languages illustration

أتقن الخوارزميات مع Coddy

ابدأ الآن