
نشرت مؤخرا العديد من المقالات حول خوارزميات الفرز المختلفة ومقارنتها ، قررت أن أجعل مني خمسة سنتات.
أريد أن أخبركم عن الخوارزمية المفضلة لفرز LSD (معدل الأرقام الأقل أهمية - أولًا البتة الأقل أهمية) مع العد (ترتيب الفرز). تم إعادة النظر في الخوارزمية الكلاسيكية إلى حد ما من قبل المؤلف نحو بعض التحسينات لصالح التسارع والبساطة.
لذلك ، الفرز المقترح مستدام. سنقوم بفرز عدد صحيح 32 بت. للعمل ، تحتاج إلى ذاكرة (~ + 4 كيلوبايت) إضافية ، وهو أمر يضيع إلى حد ما ، ولكنه يتيح لك تحقيق بعض الزيادة في الأداء.
في هذا النوع من LSD ، لا تستخدم المقارنات والتبادلات ، الخوارزمية خطية تمامًا. التعقيد الحسابي O (N).
الميزة الرئيسية للخوارزمية هي الكفاءة العالية لمجموعات البيانات المختلطة للغاية أو العشوائية. في المجموعات التي تم فرزها تقريبًا ، من المنطقي استخدام خوارزميات أخرى ، لأن الكسب لن يكون كبيرًا. إنه يعمل بشكل سيء على صفائف صغيرة ، أقل من بضع مئات من العناصر.
يتم الفرز محليًا لحفظ الذاكرة.
الرمز مكتوب باللغة Pascal ، لكن لن يكون من الصعب نقله إلى أي لغة مناسبة لك.
يتكون تسلسل التنفيذ من مرحلتين:
- لكل كتلة (ثمانية أرقام ثنائية - 1 بايت (القيمة المثلى)) ، عن طريق العد ، يتم حساب موضعها في صفيف جديد.
- بالتتابع لكل كتلة (من الأقل أهمية إلى الأعلى) ، ينتقل إلى الموضع المحسوب مسبقًا.
التحسينات:
- بالنسبة لمجموعة من الإزاحات ، نستخدم المحاذاة في الذاكرة ، وبسبب الحجم الصغير الذي تم وضعه في L1 - ذاكرة التخزين المؤقت للمعالج.
- يتم ملء صفيف الإزاحة على الفور لجميع الأرقام ، مما يسمح لك بالتجول في الصفيف لإجراء العد مرة واحدة فقط.
- لا يبدأ حساب الموضع من رأس الصفيف ، ولكن من النهاية ، يحل هذا مشكلتين:
- نهاية الصفيف في الممر الأول موجودة بالفعل في ذاكرة التخزين المؤقت "المحسنة" ، والتي مع صفائف كبيرة تعطي تسارعًا بسيطًا ؛
- ثانياً ، تكون الدورة التنازلية إلى الصفر أقصر بواسطة تعليمة مجمع واحد ، في كل خطوة من مراحل الدورة ، بالنسبة إلى الدورة الصعودية.
- لكل تكرار (من أصل أربعة) ، لا يتم استخدام حلقة متداخلة ، وإن كانت أقل جمالا ، ولكن يتم حفظ العديد من إرشادات المعالج الأخرى.
بسبب بساطته ، يكون الرمز متطابقًا تقريبًا في السرعة لكل من برنامج التحويل البرمجي 32 و 64 بت. إذا لزم الأمر ، فمن السهل أن نتخيل نسخة من الخوارزمية لأرقام 16 و 64 بت.
مقارنة خوارزمية أخذ العينات العشوائية مع الفرز السريع على منصة 64 بت (في المتوسط ، عشر تمريرات لكل منهما).

نرحب بالاقتراحات والتعليقات المتعلقة بالتحسينات.
شكرا لك