الفرز المستقر يحفظ ترتيب السجلات المتعادلة في المفتاح المستخدم. نطبقه على مفتاحين في بايثون. [1]
الخلاصة السريعة
افرز بالمفتاح الثانوي أولًا، ثم بالمفتاح الأساسي بفرز مستقر. [1]
- نرتب المجموعة تصاعديًا: 0 ثم 1؛ وداخلها القيمة تنازليًا: 8 ثم 5. وعند تساوي المفتاحين نحتفظ بترتيب الإدخال.
- في مثالنا، الفرز بالقيمة تنازليًا أولًا يعطي: A → D → F → B → C → E.
- الفرز بالمجموعة تصاعديًا بعده يعطي: D → B → E → A → F → C؛ يبدأ بأفراد المجموعة 0، وتبقى B قبل E و A قبل F.
- مع reverse=True يبقى الفرز مستقرًا عند التعادل. أما عكس القائمة التصاعدية كاملة فيقلب ترتيب المتعادلات. [1]
- إذا فرزت المجموعة أولًا ثم القيمة، تحصل على: D → A → F → B → E → C؛ وهذا لا يجمع المجموعة 0 قبل المجموعة 1.
- يفرز البرنامج فهرس القيمة 2 ثم المجموعة 1. تبقى قائمة الإدخال، وتكون النتائج قوائم جديدة. [1]
اكتب الأولوية قبل كتابة الفرز
في جدولنا ست بطاقات حسابية أعددناها، لا بيانات أشخاص. الحرف اسم للبطاقة، والمجموعة عدد 0 أو 1، والقيمة عدد 5 أو 8. نقرأ ترتيب الإدخال من أعلى الجدول إلى أسفله. الاسم للتتبع، ولا يدخل في مفتاح الفرز.
المطلوب مجموعة 0 قبل مجموعة 1، وداخل كل مجموعة تأتي القيمة 8 قبل 5. إذا تعادل المفتاحان، نريد المحافظة على ترتيب الإدخال. لذلك B تسبق E عند المجموعة 0 والقيمة 5، و A تسبق F عند المجموعة 1 والقيمة 8.
الاستقرار يحفظ الترتيب النسبي للمتعادلات في المفتاح الحالي؛ لا يمنع انتقال السجلات إلى مواضع أخرى. [1]
| الاسم | المجموعة | القيمة |
|---|---|---|
| A | 1 | 8 |
| B | 0 | 5 |
| C | 1 | 5 |
| D | 0 | 8 |
| E | 0 | 5 |
| F | 1 | 8 |
ابدأ بالقيمة لأنها المفتاح الثانوي
في الفرز المتعدد المستقر، نفذ المفتاح الأقل أولوية أولًا. [1]
القيمة أقل أولوية من المجموعة في طلبنا. بعد فرزها تنازليًا يصبح الترتيب A → D → F → B → C → E. البطاقات الثلاث الأولى قيمتها 8، والباقية قيمتها 5. ما زالت A قبل F، وما زالت B قبل E.
تقبل sorted() المعامل reverse=True للاتجاه التنازلي، مع بقاء الاستقرار. [1]
انتبه إلى الفرق بين اختيار هذا المعامل وعكس قائمة مرتبة تصاعديًا كاملة. في بياناتنا، عكس قائمة القيمة التصاعدية يعطي F → D → A → E → C → B، فيقلب ترتيب المتعادلات أيضًا. لهذا لا نستخدمه بديلًا في برنامجنا.
اجعل المجموعة المفتاح الأخير في التنفيذ
خذ ناتج الخطوة الأولى، ثم افرزه بالمجموعة تصاعديًا. من تسلسله الحالي تستخرج المجموعة 0 البطاقات D ثم B ثم E؛ وتستخرج المجموعة 1 البطاقات A ثم F ثم C. النتيجة الكاملة D → B → E → A → F → C.
داخل المجموعة 0 توجد قيمة 8 ثم قيمتا 5، وداخل المجموعة 1 قيمتا 8 ثم قيمة 5. وهكذا يطابق الناتج طلبنا. الصورة الرئيسية تتبع القائمة خلال الخطوتين؛ الترقيم من اليسار إلى اليمين يصف ترتيب القائمة.
لو عكست ترتيب المتعادلات كما في البديل السابق، ثم فرزت المجموعة، لصارت النتيجة D → E → B → F → A → C. القيم داخل المجموعات صحيحة، لكن ترتيب التعادل يخالف المطلوب؛ لذلك لا تكفي مراجعة الأعداد وحدها.
تبديل الخطوتين يغير الأولوية
نفذ تجربة حسابية أخرى: افرز الإدخال بالمجموعة أولًا، فتحصل على B → D → E → A → C → F. ثم افرز هذه القائمة بالقيمة تنازليًا، فتحصل على D → A → F → B → E → C.
في الناتج الأخير جاءت A من المجموعة 1 قبل B من المجموعة 0. لم يعد ترتيب المجموعة هو الشرط الأعلى؛ أصبحت القيم 8 كلها قبل القيم 5. كل عملية فرز منفردة صحيحة، لكن ترتيب التنفيذ يحل طلبًا مختلفًا.
الصورة الداخلية تقارن النتيجة المطلوبة بنتيجة تبديل الخطوتين. اللون يبين المجموعة، لا درجة صحة البطاقة. استخدم الاسم مع حقلي المجموعة والقيمة حتى تحدد موضع الاختلاف بدقة.

نفذ المثال ثم قارن الأسماء
هذا برنامج مستقل لنفس بيانات الجدول. يمثل كل صف اسمًا ثم مجموعة ثم قيمة؛ لذلك يقرأ المفتاح الأول المنفذ الخانة ذات الفهرس 2، ويقرأ المفتاح الثاني الخانة ذات الفهرس 1. لا تضف الاسم إلى المفتاح دون قصد، لأنه سيغير قاعدة التعادل المطلوبة.
تُعيد sorted() قائمة جديدة؛ ويبقى ترتيب الإدخال في records. [1]
records = [
("A", 1, 8),
("B", 0, 5),
("C", 1, 5),
("D", 0, 8),
("E", 0, 5),
("F", 1, 8),
]
by_score = sorted(
records,
key=lambda r: r[2],
reverse=True,
)
result = sorted(
by_score,
key=lambda r: r[1],
)
print([r[0] for r in result])
راجع التعادل وترتيب الإدخال
ناتج البرنامج للأسماء هو D → B → E → A → F → C. راجع شرطين عدديين: مجموعات 0 قبل 1، وقيم 8 قبل 5 داخل كل مجموعة. ثم راجع شرط التعادل: B قبل E، و A قبل F. البطاقات الست موجودة مرة واحدة في الناتج.
إذا بدلت موضع B و E في الإدخال، مع إبقاء حقولهما كما هي، يعكس الفرز المستقر ترتيبهما النهائي تبعًا للإدخال الجديد. الاستقرار لا يجعل الاسم الأصغر أولًا تلقائيًا. ولهذا يجب أن تعرف أي ترتيب إدخال تريد الاحتفاظ به.
جرّب المثال على أعداد المجموعة والقيمة كما هي. لا يدعي هذا النموذج معالجة حقول ناقصة أو قيم من أنواع مختلفة؛ ولم نقس سرعة الفرز. الغرض التحقق من الأولوية والتعادل في نتيجة تستطيع مراجعتها كاملة.
اقرأ أيضًا: بحث عن لغات البرمجة: من صياغة التعليمات إلى فحص النتيجة
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
