استراتيجيات الحل: البحث والترتيب
نتعلّم طرقًا مجرّبة للبحث عن عنصر، وإيجاد الأكبر، وترتيب البيانات. ⏱ نحو 20 دقيقة.
- تفكّر في الحل خطوة بخطوة قبل كتابة الكود.
- تجد الأكبر أو الأصغر بحلقة بنفسك.
- تكتب دالة البحث الخطّي.
- ترتّب القائمة بـ
sortوsorted.
١كيف نفكّر في الحل؟
قبل الكود نفكّر: ماذا يفعل الإنسان لو حلّ المشكلة بيده؟ لو أعطاك المعلم كومة أوراق اختبار وطلب أعلى درجة، ستقلّب الأوراق واحدة واحدة، وتتذكر أعلى درجة رأيتها حتى الآن. هذه هي الخوارزمية، والكود مجرد ترجمة لها.
٢إيجاد الأكبر بأنفسنا
بدون max: نفترض أن أول عنصر هو الأكبر، ثم نقارن به كل عنصر:
marks = [70, 85, 92, 60, 78]biggest = marks[0]for m in marks: if m > biggest: biggest = mprint("الأعلى:", biggest)
لماذا نتعلّم هذا وعندنا max؟ لأن الفكرة نفسها تحلّ مشكلات لا توجد لها دالة جاهزة، مثل: من صاحب أعلى درجة؟
names = ["علي", "سارة", "خالد"]marks = [70, 95, 88]best = 0for i in range(len(marks)): if marks[i] > marks[best]: best = iprint("الأول:", names[best], "بدرجة", marks[best])
٣البحث الخطّي
البحث الذي كتبته في الدرس السابق اسمه البحث الخطّي: نفحص العناصر بالترتيب من الأول. نكتبه هنا في دالة تُرجع رقم الخانة، أو -1 إذا لم نجد العنصر:
def search(items, target): for i in range(len(items)): if items[i] == target: return i return -1 codes = [305, 112, 480, 221]print(search(codes, 480))print(search(codes, 999))
لاحظ أن return -1 خارج الحلقة: لا نقول «غير موجود» إلا بعد أن نفحص كل العناصر.
٤الترتيب
ترتيب البيانات يسهّل قراءتها والبحث فيها. في بايثون طريقتان جاهزتان:
| الطريقة | ماذا تفعل |
|---|---|
a.sort() | ترتّب القائمة نفسها |
sorted(a) | تُرجع قائمة جديدة مرتبة، والأصلية لا تتغيّر |
a.sort(reverse=True) | ترتيب من الأكبر إلى الأصغر |
marks = [70, 85, 92, 60, 78]marks.sort()print(marks)marks.sort(reverse=True)print("أعلى ثلاث درجات:", marks[0], marks[1], marks[2])
📎 للاستزادة (اختياري): كيف يرتّب الحاسب؟
أبسط فكرة: ابحث عن أصغر عنصر وضعه في الخانة الأولى، ثم ابحث عن أصغر الباقي وضعه في الثانية، وهكذا. اسمها الترتيب بالاختيار:
a = [5, 2, 8, 1]for i in range(len(a)): small = i for j in range(i + 1, len(a)): if a[j] < a[small]: small = j a[i], a[small] = a[small], a[i]print(a)
توقّع وتحقّق
عند البحث عن الأكبر بأنفسنا، بأي قيمة نبدأ؟
ماذا تُرجع دالة search في الدرس إذا لم تجد العنصر؟
-1 تعني «غير موجود».ما الفرق بين sort و sorted؟
sorted تحافظ على الأصلية.لترتيب القائمة من الأكبر إلى الأصغر نكتب:
reverse=True تعكس الاتجاه.الخلاصة
- ابدأ بالسؤال: كيف أحل المشكلة بيدي؟ ثم ترجم الخطوات إلى كود.
- للأكبر: ابدأ بأول عنصر، وحدّثه كلما وجدت أكبر منه.
- البحث الخطّي يفحص العناصر بالترتيب، ويُرجع
-1بعد الحلقة إذا لم يجد. a.sort()ترتّب القائمة نفسها، وsorted(a)تُرجع نسخة مرتبة.
تحدٍّ برمجي: أقل درجة بلا min
متوسطلديك marks = [77, 64, 90, 58, 83]. اكتب برنامجًا يجد أقل درجة بحلقة for دون استخدام min، ثم يطبعها.
- ابدأ smallest بأول عنصر.
- قارن كل عنصر بـ smallest.
- اطبع: الأقل: ثم القيمة.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
marks = [77, 64, 90, 58, 83]smallest = marks[0]
💡 تلميح 1
💡 تلميح 2
if m < smallest: smallest = mحاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
marks = [77, 64, 90, 58, 83]smallest = marks[0]for m in marks: if m < smallest: smallest = mprint("الأقل:", smallest)