خوارزميات الترتيب
| English | العربية |
|---|---|
| bubble sort/ˈbʌbl sɔːt/ | فرز الفقاعات |
| insertion sort/ɪnˈsɜːʃn sɔːt/ | فرز الإدراج |
| in place/ɪn pleɪs/ | في المكان |
| stable/ˈsteɪbl/ | استقراراً |
الفرز الذي بطيء عمداً
- كل مكتبة جادة تقوم بالفرز باستخدام خوارزمية لا يُطلب منك كتابتها في الامتحان. كلا من فرز الفقاعات وفرز الإدراج هما $O(n^2)$، وكلاهما يتفوق عليهما أي فرز جيد على قائمة كبيرة.
- هي في المنهج anyway، ولأسباب جيدة: فهي قصيرة بما يكفي للتتبع يدوياً، والتتبع هو ما تعلمك كيف يقوم الفرز فعلياً بفعله على المصفوفة.
- هناك أيضاً حالة حقيقية لاستخدام فرز الإدراج. على قائمة صغيرة أو شبه مرتبة بالفعل، هو حقاً الأسرع، وتنتقل المكتبات الحقيقية إليه لهذه الحالات تحديداً.
- هذه الدرس فرز الفقاعات وفرز الإدراج: الخوارزميات، سلوكها، وأين يربح كل واحد منهما.
فرز الفقاعات
FOR pass ← 1 TO n - 1
swapped ← FALSE
FOR i ← 1 TO n - pass
IF A[i] > A[i + 1] THEN
swap A[i], A[i + 1]
swapped ← TRUE
ENDIF
NEXT i
IF NOT swapped THEN // already sorted
EXIT FOR
ENDIF
NEXT pass
- كل دورة تقارن الأزواج المجاورة وتبدل أي منها غير مرتبة، بحيث "تصعد" أكبر قيمة متبقية إلى النهاية.
- بعد الدورة $k$ تكون آخر $k$ عناصر نهائية، ولهذا تتوقف الحلقة الداخلية عند $n - \text{pass}$.
- علم
swappedيسمح بالتوقف المبكر: إذا لم تتم أي تبديل خلال دورة كاملة، فإن القائمة مرتبة.
فرز الإدراج
FOR i ← 2 TO n
key ← A[i]
j ← i - 1
WHILE j >= 1 AND A[j] > key DO
A[j + 1] ← A[j] // shift right
j ← j - 1
ENDWHILE
A[j + 1] ← key // drop it in
NEXT i
- يبني قسمًا مرتبًا في البداية، وينمو بعنصر واحد في كل مرة. يتم إبعاد كل عنصر جديد كـ
key، وتزاحم العناصر الأكبر لليمين لفتح فراغ، ثم تُوضع المفتاح. - هكذا يرتب معظم الناس مجموعة من بطاقات اللعب، وهو التشبيه المتوقع في الامتحان.

الجزء الأيسر مرتب، والجزء الأيمن غير مساس به، والحدود يتحرك لليمين
خوارزميات الترتيب
يقارن المجاورين، ويبدلهما إذا لزم الأمر
مرر عبر ترتيب الفقاعات: كل دورة تطفو أكبر قيمة نحو النهاية.
يعمل ترتيب الفقاعات عن طريق:
تقوم كل دورة بتبديل الأزواج المجاورة، "مفقعة" العنصر الأكبر نحو النهاية.
تعقيد الوقت في الحالة المتوسطة/الأسوأ لترتيب الفقاعات هو:
حلقتان متداخلتان على n عنصر تعطيان O(n²)؛ والحالة المثلى (مرتبة مسبقًا) هي O(n) مع الخروج المبكر.
مثال محلول: تتبع دورة واحدة
- تتبع الدورة الأولى لفرز الفقاعات على 5, 3, 8, 1.
- قارن 5 و3: غير مرتبين، تبدل، فتصبح 3, 5, 8, 1. قارن 5 و8: مرتبان، لا تبديل. قارن 8 و1: تبدل، فتصبح 3, 5, 1, 8.
- بعد دورة واحدة أصبحت أكبر قيمة، وهي 8، في موقعها النهائي، ويمكن تخطي مقارنة واحدة إضافية في كل دورة من الآن فصاعدًا.
- الآن تتبع الخطوة الثالثة لفرز الإدراج على 3, 5, 8, 1. المفتاح هو 1. أزاحم 8 و5 و3 كلًا منهما خانة واحدة لليمين، ثم ضع 1 في البداية: 1, 3, 5, 8. اعرض المصفوفة بعد كل خطوة؛ فهنا توجد الدرجات.
يبنى ترتيب الإدراج النتيجة المرتبة عن طريق:
إنه يبني بادئة مرتبة على اليسار، وينقل العناصر الأكبر يمينًا لإفراغ مساحة لكل مفتاح ليوضع في محله.
كيف يضع ترتيب الإدراج كل عنصر جديد؟
إبقاء المفتاح جانبًا والنقل هو ما يميزه عن التبديلات المتكررة للمجاورين في ترتيب الفقاعات.
الأداء
| فقاعات | إدراج | |
|---|---|---|
| الحالة الأفضل | $O(n)$، دورة واحدة بدون تبدلات | $O(n)$، مرتبة مسبقًا، بدون تزاحم |
| المتوسطة والأسوأ | $O(n^2)$ | $O(n^2)$ |
| ذاكرة إضافية | $O(1)$، محلي | $O(1)$، محلي |
| مستقر | نعم | نعم، مستقر |
- محلي يعني أنه يحتاج فقط لكمية ثابتة من الذاكرة الإضافية، ويرتب داخل المصفوفة نفسها. مستقر يعني أن قيمتين متساويتين تحتفظان بترتيبهما النسبي الأصلي، وهو مهم عندما تكون القائمة مرتبة مسبقًا بمجال آخر.
- كلاهما يصل إلى $O(n)$ على بيانات مرتبة مسبقًا، ولكن فقط إذا كان فرز الفقاعات يحتوي على علم
swapped. بدون هذا العلم، فإنه ينفذ جميع الدورات دائمًا.
بعد الدورة الأولى لترتيب الفقاعات على 5, 3, 8, 1، ما هي المصفوفة؟ اكتب الأرقام الأربعة مفصولة بفاصلة.
5 و 3 يتبادلان، 5 و 8 لا يتبادلان، 8 و 1 يتبادلان. وصلت أكبر قيمة إلى النهاية، لذا يمكن أن تكون الدورة التالية أقصر بمقارنة واحدة.
مثال محلول: أي فرز، ولماذا
- قائمة من 200,000 سجل يجب فرزها من الصفر. لا لأحدهما: كلاهما $O(n^2)$، لذا تحتاج إلى دمج أو سريع فرز في $O(n \log n)$. قل ذلك بدلاً من اختيار الأقل سوءًا.
- قائمة مرتبة من 10,000 تستقبل 5 سجلات جديدة في النهاية ويجب فرزها مجددًا. فرز الإدراج: البيانات شبه مرتبة، لذا يزياحم كل مفتاح جديد مسافة قصيرة ويتقارب نحو $O(n)$.
- مثال تعليمي يجب تتبعه يدويًا على ورق. فرز الفقاعات: هو الأسهل في المتابعة، وهو استخدامه الحقيقي المتبقي.
- برر بناءً على حالة البيانات والحجم، وليس تفضيلًا عامًا.
طابق كل فكرة ترتيب بما تعنيه.
ترتيب الفقاعات يبدل الجيران، وترتيب الإدراج يبني بادئة مرتبة؛ كلاهما O(n²) في الحالة الأسوأ؛ والاستقرار يتعلق بترتيب المفاتيح المتساوية.
يعمل ترتيب الإدراج بالقرب من O(n) على المصفوفات الصغيرة أو شبه المرتبة، لأن القليل من العناصر يحتاج إلى نقل.
على البيانات شبه المرتبة، يكون كل عنصر جديد قريبًا من موضعه بالفعل — ولهذا يتفوق ترتيب الإدراج على الترتيبات الأكثر تعقيدًا على المدخلات الصغيرة.
ما هي العبارات الصحيحة لكل من ترتيب الفقاعات وترتيب الإدراج؟ حدد كل الخيارات الصحيحة.
على قائمة كبيرة غير مرتبة، يتفوق ترتيب O(n log n) بحسم. هذا هو الإجابة الصحيحة، وليس اختيار الأقل سوءًا بين الاثنين.
لماذا دورة واحدة ليست القصة الكاملة
- كلا الفرزين ينفذان دورات متكررة، ويميز بينهما الامتحان بما تحققه دورة واحدة ومتى يتوقفان.
- دورة فرز الفقاعات تقارن أزواجًا مجاورة وتبدلها، لذا تحمل الدورة الواحدة أكبر عنصر متبقي إلى موقعه النهائي. الفرز الكامل يستغرق $n - 1$ دورات.
- دورة فرز الإدراج تأخذ العنصر التالي وتحركه للخلف إلى الجزء المرتب بالفعل، لذا بعد $k$ دورات تكون أول $k$ عناصر مرتبة بينها البعض لكنها ليست في موقعها النهائي بعد.
- يمكن تحسين فرز الفقاعات بـعلم: إذا لم تتم أي تبدلات في دورة، فإن القائمة مرتبة مسبقًا وتتوقف الخوارزمية. على بيانات شبه مرتبة يحوله هذا إلى دورة واحدة.
- بدون العلم، كلاهما $n^2$ في أسوأ حالة، ولهذا Either خيار سيئ للملف الكبير ولماذا يسأل الامتحان عن الصغيرة.
قائمة مرتبة تحتوي على 10,000 سجل تكسب 5 سجلات جديدة في النهاية. أي ترتيب يناسب إعادة ترتيبها؟
البيانات شبه المرتبة تمثل بالضبط الحالة المثالية لفرز الإدراج، حيث تقترب من O(n). تتحول المكتبات الحقيقية إليه لهذا السبب.
طابق كل خوارزمية فرز بما تحقيقه مرحلة واحدة منها.
هذا الفرق هو ما تختبره أسئلة التتبع حقًا. كما أن علم إشارة فرز الفقاعات يسمح له بالتوقف مبكرًا على البيانات شبه المرتبة، وهو أمر يتعامل معه فرز الإدراج بشكل جيد anyway.
علامات ضائعة
- فرز الفقاعات يقارن أزواجًا مجاورة. الإجابة التي تقارن عنصرًا مع جميعOthers تصف خوارزمية مختلفة.
- يقل كل مرور في الحلقة الداخلية، لأن نهاية المصفوفة أصبحت نهائية. اذكر السبب.
- الترتيب بالإدراج يقوم بـ نقل العناصر لليمين لفتح فراغ؛ ولا يقوم بالتبديل بشكل متكرر. هذا التمييز هو جوهر الخوارزمية.
- كلاهما $O(n^2)$ في المتوسط وفي أسوأ الحالات، و$O(n)$ في أفضل حالة. قدم الحالة مع الترتيب.
لقد فهمت الأمر
- ترتيب الفقاعات: مرورات متكررة تقارن أزواجًا متجاورة وتقوم بالتبديل، حيث تصعد أكبر عنصر إلى النهاية، وتتقلص الحلقة الداخلية في كل مرور، مع وجود علم
swappedللخروج المبكر - ترتيب الإدراج: توسيع جزء مرتب في البداية، مع إبقاء كل مفتاح جانبًا، ونقل العناصر الأكبر يمينًا وإسقاط المفتاح في الفراغ
- كلاهما $O(n^2)$ متوسط وأسوأ، $O(n)$ أفضل، محليًا ومستقر
- ترتيب الإدراج يتفوق حقًا على القوائم الصغيرة أو شبه المرتبة تقريبًا؛ أما بالنسبة لقائمة غير مرتبة كبيرة، فلا واحد منهما هو الإجابة الصحيحة