🌟 فهم خوارزمية Bubble Sort: أبسط طرق ترتيب البيانات في بايثون

اليوم سنغوص في عالم خوارزميات الترتيب مع واحدة من أشهرها وأبسطها: Bubble Sort أو "الترتيب الفقاعي". إذا كنت تتساءل كيف يمكن لبرنامجك ترتيب قائمة من الأرقام من الأصغر إلى الأكبر، فأنت في المكان الصحيح! 🎯


🤔 ما هي خوارزمية Bubble Sort؟

تخيل أن لديك مجموعة من الفقاعات بأحجام مختلفة في حوض ماء. الفقاعات الأكبر حجماً تتصاعد إلى السطح أسرع من الفقاعات الأصغر. فكرة خوارزمية Bubble Sort مشابهة جداً لهذه الصورة!

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

الفكرة الأساسية: العناصر الأكبر "تطفو" أو تتحرك ببطء نحو نهاية القائمة، مثل فقاعة الهواء التي تصعد إلى سطح الماء.


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

لنفترض أن لدينا القائمة التالية ونريد ترتيبها من الأصغر إلى الأكبر: [5, 1, 4, 2, 8]

لنتابع خطوات الخوارزمية معاً:

  1. الممر الأول (First Pass):
    • (5, 1) -> 5 > 1 -> مبادلة -> القائمة تصبح: [1, 5, 4, 2, 8]
    • (5, 4) -> 5 > 4 -> مبادلة -> القائمة تصبح: [1, 4, 5, 2, 8]
    • (5, 2) -> 5 > 2 -> مبادلة -> القائمة تصبح: [1, 4, 2, 5, 8]
    • (5, 8) -> 5 < 8 -> لا مبادلة -> القائمة تبقى: [1, 4, 2, 5, 8]
    • بعد الممر الأول، أكبر عنصر (8) أصبح في موقعه الصحيح في النهاية.
  2. الممر الثاني (Second Pass):
    • (1, 4) -> 1 < 4 -> لا مبادلة -> [1, 4, 2, 5, 8]
    • (4, 2) -> 4 > 2 -> مبادلة -> القائمة تصبح: [1, 2, 4, 5, 8]
    • (4, 5) -> 4 < 5 -> لا مبادلة -> [1, 2, 4, 5, 8]
    • بعد الممر الثاني، العنصر الثاني الأكبر (5) أصبح في موقعه الصحيح.
  3. الممر الثالث (Third Pass):
    • لا تحدث أي مقايضة، مما يعني أن القائمة أصبحت مرتبة! تخبرنا الخوارزمية الذكية أنه يمكنها التوقف هنا.

كما ترى، استغرقنا عدة "ممرات" عبر القائمة حتى تم ترتيبها بالكامل.


💻 تنفيذ خوارزمية Bubble Sort في كود بايثون

الآن، حان وقت الترجمة إلى لغة Python. سنكتب دالة تقوم بترتيب قائمة مدخلة باستخدام Bubble Sort.

def bubble_sort(my_list):
    """
    دالة لترتيب قائمة من الأرقام بترتيب تصاعدي باستخدام خوارزمية Bubble Sort.
    """
    # n هو طول القائمة
    n = len(my_list)
    
    # نمر على جميع عناصر القائمة (عدد المرات التي سنكرر فيها العملية)
    for i in range(n):
        # علمية التبديل حدثت في هذا الممر؟
        swapped = False
        
        # آخر i عناصر موجودة بالفعل في مكانها الصحيح
        for j in range(0, n - i - 1):
            # قارن العنصر الحالي بالعنصر الذي يليه
            if my_list[j] > my_list[j + 1]:
                # إذا كان الترتيب خاطئاً، قم بمبادلتهما
                my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]
                swapped = True # علمنا أن حدثت عملية تبديل
                
        # إذا لم تحدث أي مبادلة في الممر الداخلي، فإن القائمة مرتبة ويمكننا الخروج
        if not swapped:
            break

# لنختبر الدالة على المثال الذي ناقشناه
numbers = [5, 1, 4, 2, 8]
print("القائمة الأصلية:", numbers)

bubble_sort(numbers) # استدعاء الدالة لترتيب القائمة

print("القائمة بعد الترتيب:", numbers)

شرح الكود:

  • def bubble_sort(my_list):: نعرف دالة اسمها bubble_sort تأخذ معامل واحد هو القائمة المراد ترتيبها.
  • n = len(my_list): نحصل على طول القائمة ونخزنه في المتغير n.
  • for i in range(n):: هذه الحلقة الخارجية تمثل عدد المرات التي سنكرر فيها عملية المسح عبر القائمة (عدد الممرات).
  • swapped = False: نستخدم هذا المتغير لنتتبع ما إذا حدثت أي مبادلة خلال الممر الحالي. هذا يحسن من كفاءة الخوارزمية.
  • for j in range(0, n - i - 1):: هذه الحلقة الداخلية تمثل الممر الفعلي عبر القائمة. ننظر إلى كل زوج من العناصر المتجاورة. نطرح i لأننا نعلم أن آخر i عناصر قد تم ترتيبها بالفعل في الممرات السابقة.
  • if my_list[j] > my_list[j + 1]:: هنا نقارن العنصر الحالي بالعنصر الذي يليه.
  • my_list[j], my_list[j + 1] = my_list[j + 1], my_list[j]: إذا كانت المقارنة صحيحة (أي أن الترتيب خاطئ)، نقوم بمبادلة قيمتي العنصرين باستخدام هذه الصيغة Pythonic الرائعة!
  • if not swapped: break: إذا لم تحدث أي مبادلة خلال ممر كامل، فهذا يعني أن القائمة أصبحت مرتبة ولا داعي لاستكمال الممرات المتبقية.

⚖️ إيجابيات وسلبيات Bubble Sort

الإيجابيات:

  • البساطة: سهلة الفهم والتنفيذ، مما يجعلها ممتازة لأغراض التعليم. ✅
  • لا تحتاج مساحة إضافية: تعمل على ترتيب القائمة الموجودة دون الحاجة لإنشاء قائمة جديدة (In-place). ✅

السلبيات:

  • بطيئة جداً: غير مناسبة للقوائم الكبيرة. أداؤها ضعيف مقارنة بخوارزميات أخرى مثل Quick Sort أو Merge Sort. ❌

🧪 جربها بنفسك!

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

# جرب هذه الأمثلة:
# numbers = [64, 34, 25, 12, 22, 11, 90]
# numbers = [3, 2, 1]
# numbers = [1] # ماذا يحدث مع قائمة من عنصر واحد؟

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

الآن وقد أتقنت Bubble Sort، حان الوقت للانتقال إلى خوارزمية ترتيب أخرى أكثر كفاءة! في الدرس القادم، سنتعرف على خوارزمية Selection Sort (ترتيب الاختيار). سنرى كيف تختلف فكرتها عن Bubble Sort، حيث تقوم باختيار أصغر عنصر ووضعه في مكانه الصحيح مباشرة. استعد لمقارنة مثيرة بين طريقتين مختلفتين لحل نفس المشكلة! 🚀