شرح خوارزمية الترتيب بالاختيار (Selection Sort) في بايثون 🚀

اليوم سنتعلم واحدة من أبسط خوارزميات الترتيب، وهي خوارزمية الترتيب بالاختيار. إذا كنت تريد فهم كيف يمكننا ترتيب قائمة من الأرقام من الأصغر إلى الأكبر (أو العكس) بطريقة سهلة الفهم، فأنت في المكان الصحيح! هيا نبدأ. ✨


ما هي خوارزمية الترتيب بالاختيار؟ 🤔

ببساطة شديدة، تخيل أن لديك مجموعة من الأرقام غير مرتبة على الطاولة. طريقة الترتيب بالاختيار تشبه تماماً ما يفعله الإنسان: تبحث عن أصغر عنصر في المجموعة كلها، ثم تضعه في البداية. ثم تكرر هذه العملية على باقي الأرقام غير المرتبة.

الفكرة الأساسية هي:

  1. ابحث عن أصغر عنصر في المصفوفة.
  2. ابدله مع العنصر الأول في المصفوفة.
  3. كرر العملية على باقي المصفوفة (بدءاً من العنصر الثاني، ثم الثالث، وهكذا).

كيف تعمل الخوارزمية خطوة بخطوة؟ 👣

لنفترض أن لدينا مصفوفة صغيرة تحتوي على الأرقام: [64, 25, 12, 22, 11]. سنرتبها تصاعدياً (من الأصغر إلى الأكبر).

المرحلة الأولى:

  • ننظر إلى المصفوفة كاملة [64, 25, 12, 22, 11].
  • نجد أن أصغر عنصر هو 11.
  • نبدل موقع العنصر الأول (64) مع أصغر عنصر (11).
  • تصبح المصفوفة: [11, 25, 12, 22, 64]. الآن، العنصر الأول (11) في مكانه الصحيح النهائي.

المرحلة الثانية:

  • ننظر إلى الجزء غير المرتب من المصفوفة، وهو [25, 12, 22, 64] (تجاهلنا العنصر الأول المرتب).
  • نجد أن أصغر عنصر في هذا الجزء هو 12.
  • نبدل موقع أول عنصر في هذا الجزء (25) مع أصغر عنصر (12).
  • تصبح المصفوفة: [11, 12, 25, 22, 64]. الآن، العنصران الأولان في مكانهما الصحيح.

المرحلة الثالثة:

  • ننظر إلى الجزء غير المرتب: [25, 22, 64].
  • أصغر عنصر هو 22.
  • نبدل موقع 25 و 22.
  • تصبح المصفوفة: [11, 12, 22, 25, 64].

المرحلة الرابعة:

  • ننظر إلى الجزء غير المرتب: [25, 64].
  • أصغر عنصر هو 25، وهو موجود بالفعل في المكان الصحيح (أول عنصر في الجزء غير المرتب).
  • لا حاجة لتبديل.
  • المصفوفة النهائية المرتبة هي: [11, 12, 22, 25, 64].

كما ترى، في كل مرحلة (أو تمريرة) نحدد موقع أصغر عنصر ونجعله يشغل الموضع التالي في بداية المصفوفة المرتبة.


تنفيذ الخوارزمية بكود بايثون 🐍

الآن، لنترجم هذه الخطوات إلى كود برمجي في لغة Python. الكود سيكون بسيطاً وواضحاً.

# تعريف دالة لترتيب مصفوفة باستخدام خوارزمية الاختيار
def selection_sort(arr):
    # الحصول على طول المصفوفة
    n = len(arr)
    
    # التكرار على جميع عناصر المصفوفة عدا الأخير
    for i in range(n):
        # نفترض أن العنصر الحالي (i) هو الأصغر
        min_index = i
        
        # البحث عن أصغر عنصر في الجزء غير المرتب (من i+1 إلى النهاية)
        for j in range(i+1, n):
            if arr[j] < arr[min_index]:
                min_index = j # تحديث مؤشر أصغر عنصر
                
        # تبديل موقع العنصر الأصغر الموجود مع العنصر الحالي (i)
        arr[i], arr[min_index] = arr[min_index], arr[i]
    
    # إرجاع المصفوفة المرتبة
    return arr

# مثال لاختبار الدالة
my_list = [64, 25, 12, 22, 11]
print("المصفوفة الأصلية:", my_list)

sorted_list = selection_sort(my_list)
print("المصفوفة بعد الترتيب:", sorted_list)

شرح الكود:

  • def selection_sort(arr):: نعرف دالة اسمها selection_sort تأخذ مصفوفة (arr) كمدخل.
  • n = len(arr): نخزن طول المصفوفة في متغير n لاستخدامه في الحلقات التكرارية.
  • for i in range(n):: هذه الحلقة تمر على كل موضع في المصفوفة. الموضع i هو المكان الذي سنضع فيه أصغر عنصر في كل مرة.
  • min_index = i: نفترض أن العنصر في الموضع i هو الأصغر حالياً.
  • for j in range(i+1, n):: هذه الحلقة الداخلية تبحث في باقي المصفوفة (بدءاً من i+1 إلى النهاية) عن عنصر أصغر من الذي عند min_index.
  • if arr[j] < arr[min_index]:: إذا وجدنا عنصراً أصغر، نحدث min_index ليصبح مؤشر هذا العنصر الأصغر.
  • arr[i], arr[min_index] = arr[min_index], arr[i]: بعد انتهاء البحث، نبدل مواقع العنصر الحالي i مع العنصر الأصغر الذي وجدناه min_index.
  • أخيراً، نعيد المصفوفة المرتبة.

مميزات وعيوب خوارزمية الاختيار ⚖️

المميزات:

  • البساطة: سهلة الفهم والتنفيذ.
  • أداء ثابت للذاكرة: لا تحتاج إلى مصفوفة إضافية للترتيب، فهي ترتب العناصر في مكانها (In-Place).

العيوب:

  • غير فعالة: بطيئة على المصفوفات الكبيرة. وقت التنفيذ يكون دائماً تقريباً O(n²) بغض النظر عن ترتيب البيانات الأصلية (حتى لو كانت مرتبة مسبقاً).

خلاصة الدرس 📝

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


ماذا سنتعلم في الدرس القادم؟ 🔮

الآن بعد أن أتقنت خوارزمية الترتيب بالاختيار، حان الوقت للانتقال إلى خوارزمية أخرى بسيطة وشائعة! في الدرس القادم، سنتعرف على خوارزمية الترتيب بالإدراج (Insertion Sort). ستتعلم كيف تعمل هذه الخوارزمية التي تشبه طريقة ترتيب أوراق اللعب في يدك، وسنقارنها مع خوارزمية اليوم. استعد لمزيد من التفاصيل المشوقة!