شرح خوارزمية الترتيب الفقاعي (Selection Sort Algorithm)

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

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

مقدمة

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

يعد الترتيب الفقاعي عادةً أحد أولى خوارزميات الترتيب التي تُعلّم للمبتدئين. والسبب ليس لأنه الأسرع، بل لأن منطقه سهل التصور. تقارن الخوارزمية القيم المتجاورة، وتبدلها عند الحاجة، وتكرر هذه العملية حتى تصبح المصفوفة مرتبة.

يساعد فهم الترتيب الفقاعي المطورين أيضًا على فهم سبب أهمية كفاءة الخوارزمية. قد يكون الحل صحيحًا، ولكنه لا يزال بطيئًا عندما يصبح حجم المدخلات كبيرًا. لهذا السبب، يعد الترتيب الفقاعي نقطة انطلاق جيدة لتعلم التعقيد الزمني ورموز Big O.

ما هي خوارزمية الترتيب الفقاعي؟

الترتيب الفقاعي هو خوارزمية ترتيب قائمة على المقارنة. تقارن العناصر المتجاورة في مصفوفة وتبدلها إذا لم تكن في الترتيب الصحيح.

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

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

الفكرة الأساسية للترتيب الفقاعي

الفكرة الأساسية للترتيب الفقاعي بسيطة:

  • قارن عنصرين متجاورين.

  • إذا كانا في ترتيب خاطئ، قم بتبديلهما.

  • انتقل موضعًا واحدًا إلى الأمام وكرر العملية.

  • بعد تمريرة كاملة واحدة، يتم وضع أكبر قيمة غير مرتبة بشكل صحيح.

  • كرر العملية حتى يتم ترتيب المصفوفة بأكملها.

هذا يجعل الترتيب الفقاعي سهل الفهم، ولكنه ليس فعالاً جدًا للمصفوفات الكبيرة لأنه يقوم بالعديد من المقارنات المتكررة.

الترتيب الفقاعي بكلمات بسيطة

تخيل صفًا من الأرقام. يبدأ الترتيب الفقاعي من الجانب الأيسر ويقارن كل زوج من الأرقام المتجاورة. إذا كان الرقم الأول أكبر من الرقم الثاني، فإنهما يتبادلان الأماكن.

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

تستمر هذه العملية حتى لا تكون هناك حاجة لمزيد من التبديلات، أو حتى تكمل الخوارزمية جميع التمريرات المطلوبة.

خطوات خوارزمية الترتيب الفقاعي

لترتيب مصفوفة ترتيبًا تصاعديًا، تتبع خوارزمية الترتيب الفقاعي هذه الخطوات:

  1. ابدأ من العنصر الأول في المصفوفة.

  2. قارن العنصر الحالي بالعنصر التالي.

  3. إذا كان العنصر الحالي أكبر من العنصر التالي، فقم بتبديلهما.

  4. انتقل إلى الزوج التالي من العناصر.

  5. استمر حتى نهاية الجزء غير المرتب من المصفوفة.

  6. كرر العملية لعدة تمريرات.

  7. توقف عندما تصبح المصفوفة مرتبة.

يمكن تحسين الخوارزمية بالتوقف مبكرًا إذا انتهت تمريرة كاملة دون أي تبديلات. هذا يعني أن المصفوفة مرتبة بالفعل.

مثال على التنفيذ اليدوي

لفهم الترتيب الفقاعي بوضوح، دعنا نرتب هذه المصفوفة يدويًا بترتيب تصاعدي:

[5, 1, 4, 2, 8]

الهدف هو إعادة ترتيب المصفوفة من الأصغر إلى الأكبر:

[1, 2, 4, 5, 8]

التمريرة 1

المصفوفة الأولية:

[5, 1, 4, 2, 8]
المقارنةالإجراءالمصفوفة بعد الإجراء
قارن 5 و 15 أكبر من 1، تبديل[1, 5, 4, 2, 8]
قارن 5 و 45 أكبر من 4، تبديل[1, 4, 5, 2, 8]
قارن 5 و 25 أكبر من 2، تبديل[1, 4, 2, 5, 8]
قارن 5 و 85 أصغر من 8، لا تبديل[1, 4, 2, 5, 8]

بعد التمريرة الأولى، تكون القيمة الأكبر، 8، بالفعل في موضعها النهائي الصحيح.

التمريرة 2

المصفوفة قبل التمريرة 2:

[1, 4, 2, 5, 8]
المقارنةالإجراءالمصفوفة بعد الإجراء
قارن 1 و 41 أصغر من 4، لا تبديل[1, 4, 2, 5, 8]
قارن 4 و 24 أكبر من 2، تبديل[1, 2, 4, 5, 8]
قارن 4 و 54 أصغر من 5، لا تبديل[1, 2, 4, 5, 8]

بعد التمريرة الثانية، تكون القيمة الثانية الأكبر، 5، أيضًا في موضعها النهائي الصحيح.

التمريرة 3

المصفوفة قبل التمريرة 3:

[1, 2, 4, 5, 8]
المقارنةالإجراءالمصفوفة بعد الإجراء
قارن 1 و 21 أصغر من 2، لا تبديل[1, 2, 4, 5, 8]
قارن 2 و 42 أصغر من 4، لا تبديل[1, 2, 4, 5, 8]

لم تحدث أي تبديلات في هذه التمريرة. هذا يعني أن المصفوفة مرتبة بالفعل. يمكن لخوارزمية الترتيب الفقاعي المحسّنة أن تتوقف هنا بدلاً من الاستمرار في تمريرات غير ضرورية.

المصفوفة المرتبة النهائية

المصفوفة المرتبة النهائية هي:

[1, 2, 4, 5, 8]

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

الكود الزائف للترتيب الفقاعي

يساعد الكود الزائف على شرح الخوارزمية دون التركيز على لغة برمجة معينة.

repeat for each pass:
    swapped = false

    compare each adjacent pair in the unsorted part:
        if left element is greater than right element:
            swap them
            swapped = true

    if swapped is false:
        stop because the array is already sorted

الجزء المهم هو علامة التبديل (swapped flag). تساعد الخوارزمية على اكتشاف ما إذا كانت المصفوفة مرتبة بالفعل قبل اكتمال جميع التمريرات.

مثال على الترتيب الفقاعي في PHP

يوضح المثال التالي تطبيق الترتيب الفقاعي في PHP. يقوم بترتيب مصفوفة من الأرقام ترتيبًا تصاعديًا.

<?php

declare(strict_types=1);

function bubbleSort(array $numbers): array
{
    $count = count($numbers);

    for ($i = 0; $i < $count - 1; $i++) {
        for ($j = 0; $j < $count - $i - 1; $j++) {
            if ($numbers[$j] > $numbers[$j + 1]) {
                $temporary = $numbers[$j];
                $numbers[$j] = $numbers[$j + 1];
                $numbers[$j + 1] = $temporary;
            }
        }
    }

    return $numbers;
}

$values = [5, 1, 4, 2, 8];
$sortedValues = bubbleSort($values);

print_r($sortedValues);

المخرجات:

Array
(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 5
    [4] => 8
)

هذا الإصدار صحيح، ولكنه يستمر في العمل حتى لو أصبحت المصفوفة مرتبة قبل اكتمال جميع التمريرات.

الترتيب الفقاعي المحسن في PHP

يستخدم الإصدار المحسّن متغيرًا منطقيًا يسمى swapped. إذا انتهت تمريرة كاملة دون أي تبديل، تتوقف الخوارزمية مبكرًا.

<?php

declare(strict_types=1);

function optimizedBubbleSort(array $numbers): array
{
    $count = count($numbers);

    for ($i = 0; $i < $count - 1; $i++) {
        $swapped = false;

        for ($j = 0; $j < $count - $i - 1; $j++) {
            if ($numbers[$j] > $numbers[$j + 1]) {
                [$numbers[$j], $numbers[$j + 1]] = [$numbers[$j + 1], $numbers[$j]];
                $swapped = true;
            }
        }

        if ($swapped === false) {
            break;
        }
    }

    return $numbers;
}

$values = [5, 1, 4, 2, 8];
$sortedValues = optimizedBubbleSort($values);

print_r($sortedValues);

هذا الإصدار أفضل للمصفوفات المرتبة بالفعل أو شبه المرتبة. في أفضل الحالات، يمكن أن ينتهي بعد تمريرة واحدة فقط.

مثال على الترتيب الفقاعي في جافاسكريبت

يمكن تطبيق نفس الفكرة في جافاسكريبت. تتغير بناء الجملة، لكن الخوارزمية تبقى كما هي.

function bubbleSort(numbers) {
    const result = [...numbers];
    const count = result.length;

    for (let i = 0; i < count - 1; i++) {
        let swapped = false;

        for (let j = 0; j < count - i - 1; j++) {
            if (result[j] > result[j + 1]) {
                const temporary = result[j];
                result[j] = result[j + 1];
                result[j + 1] = temporary;
                swapped = true;
            }
        }

        if (!swapped) {
            break;
        }
    }

    return result;
}

const values = [5, 1, 4, 2, 8];
console.log(bubbleSort(values));

المخرجات:

[1, 2, 4, 5, 8]

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

لماذا يصبح التكرار الداخلي أقصر

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

هذا هو السبب في أن التكرار الداخلي يستخدم هذا الشرط:

$j < $count - $i - 1

عندما يزداد $i، ينخفض عدد المقارنات. وهذا يتجنب التحقق من العناصر التي يُعرف بالفعل أنها مرتبة.

التعقيد الزمني لخوارزمية الترتيب الفقاعي

يصف التعقيد الزمني كيفية نمو وقت تشغيل الخوارزمية مع نمو حجم المدخلات. إذا كانت المصفوفة تحتوي على n عنصرًا، فقد تحتاج خوارزمية الترتيب الفقاعي إلى مقارنة العديد من أزواج العناصر.

يعتمد التعقيد الزمني للترتيب الفقاعي على ترتيب المدخلات وما إذا كان الإصدار المحسّن مستخدمًا.

الحالةالتعقيد الزمنيالشرح
أفضل حالةO(n)تكون المصفوفة مرتبة بالفعل وتتوقف الخوارزمية المحسّنة بعد تمريرة واحدة.
الحالة المتوسطةO(n²)تكون العناصر بترتيب عشوائي، لذلك هناك حاجة للعديد من المقارنات والتبديلات.
أسوأ حالةO(n²)تكون المصفوفة مرتبة بترتيب عكسي، لذلك تقوم الخوارزمية بأقصى عدد من التبديلات.

أفضل حالة هي O(n) فقط عند استخدام الإصدار المحسّن. بدون علامة التبديل (swapped flag)، يظل الترتيب الفقاعي عادةً O(n²) حتى عندما تكون المصفوفة مرتبة بالفعل لأنه لا يزال يقوم بتمريرات غير ضرورية.

التعقيد الزمني في أفضل الحالات

تحدث أفضل حالة عندما تكون مصفوفة الإدخال مرتبة بالفعل.

[1, 2, 3, 4, 5]

في الإصدار المحسّن، تقوم خوارزمية الترتيب الفقاعي بتمريرة واحدة عبر المصفوفة وتجد أنه لا توجد حاجة لتبديلات. بما أنه لا تحدث أي تبديلات، تتوقف الخوارزمية فورًا.

لمصفوفة من n عنصرًا، تحتاج تمريرة واحدة إلى حوالي n - 1 مقارنة. لذلك، فإن التعقيد الزمني في أفضل الحالات هو:

O(n)

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

التعقيد الزمني في الحالة المتوسطة

تحدث الحالة المتوسطة عندما تكون عناصر المصفوفة بترتيب عشوائي.

[4, 1, 5, 2, 3]

في هذا الموقف، عادةً ما يقوم الترتيب الفقاعي بتنفيذ عدة تمريرات. تحتاج بعض العناصر إلى التحرك عدة مواضع قبل أن تصل إلى مكانها الصحيح.

يزداد عدد المقارنات تقريبًا مع مربع حجم المدخلات. لذلك، فإن التعقيد الزمني في الحالة المتوسطة هو:

O(n²)

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

التعقيد الزمني في أسوأ الحالات

تحدث أسوأ حالة عندما تكون المصفوفة مرتبة بترتيب عكسي.

[5, 4, 3, 2, 1]

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

العدد الإجمالي للمقارنات في نهج الترتيب الفقاعي القياسي هو:

(n - 1) + (n - 2) + (n - 3) + ... + 1

هذا المجموع يساوي:

n × (n - 1) / 2

عند استخدام رمز Big O، يتم إزالة الثوابت والمصطلحات الأصغر. لذا يصبح التعقيد الزمني في أسوأ الحالات:

O(n²)

هذا هو السبب الرئيسي لعدم ملاءمة الترتيب الفقاعي لمجموعات البيانات الكبيرة.

التعقيد المكاني لخوارزمية الترتيب الفقاعي

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

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

O(1)

هذا يعني أن الترتيب الفقاعي يستخدم ذاكرة إضافية ثابتة بغض النظر عن حجم المدخلات.

هل الترتيب الفقاعي مستقر؟

الترتيب الفقاعي هو خوارزمية ترتيب مستقرة عند تطبيقها بشكل صحيح. الاستقرار يعني أن العناصر المتساوية تحتفظ بترتيبها النسبي الأصلي بعد الترتيب.

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

يظل الترتيب الفقاعي مستقرًا لأنه يبدل العناصر فقط عندما يكون العنصر الأيسر أكبر من العنصر الأيمن. لا يبدل العناصر المتساوية.

if ($numbers[$j] > $numbers[$j + 1]) {
    // swap only when left value is greater
}

إذا كان الشرط المستخدم هو >= بدلاً من >، فقد يتم تبديل العناصر المتساوية، وقد تفقد الخوارزمية استقرارها.

هل الترتيب الفقاعي يعمل في مكانه (In-Place)؟

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

يعيد مثال PHP أعلاه نسخة مرتبة لأن المصفوفات في PHP يتم تمريرها بالقيمة افتراضيًا. ومع ذلك، يمكن تطبيق الفكرة الخوارزمية نفسها في مكانها عن طريق تعديل نفس المصفوفة.

كونها "في مكانها" مفيد عندما تكون الذاكرة محدودة، لكن الترتيب الفقاعي لا يزال بطيئًا مقارنة بخوارزميات الترتيب الأكثر كفاءة.

الترتيب الفقاعي للترتيب التنازلي

يمكن للترتيب الفقاعي أيضًا ترتيب القيم ترتيبًا تنازليًا. التغيير الوحيد هو شرط المقارنة.

للترتيب التصاعدي، قم بالتبديل عندما يكون العنصر الأيسر أكبر من العنصر الأيمن:

if ($numbers[$j] > $numbers[$j + 1])

للترتيب التنازلي، قم بالتبديل عندما يكون العنصر الأيسر أصغر من العنصر الأيمن:

if ($numbers[$j] < $numbers[$j + 1])

إليك مثال PHP بسيط للترتيب التنازلي:

<?php

declare(strict_types=1);

function bubbleSortDescending(array $numbers): array
{
    $count = count($numbers);

    for ($i = 0; $i < $count - 1; $i++) {
        $swapped = false;

        for ($j = 0; $j < $count - $i - 1; $j++) {
            if ($numbers[$j] < $numbers[$j + 1]) {
                [$numbers[$j], $numbers[$j + 1]] = [$numbers[$j + 1], $numbers[$j]];
                $swapped = true;
            }
        }

        if ($swapped === false) {
            break;
        }
    }

    return $numbers;
}

أخطاء شائعة عند تطبيق الترتيب الفقاعي

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

تشمل الأخطاء الشائعة ما يلي:

  • استخدام عامل مقارنة خاطئ للترتيب التصاعدي أو التنازلي.

  • نسيان تقليل التكرار الداخلي بعد كل تمريرة.

  • الوصول إلى فهرس غير صالح مثل $numbers[$j + 1] عندما يكون $j بالفعل في الفهرس الأخير.

  • نسيان إعادة تعيين علامة التبديل (swapped flag) في بداية كل تمريرة.

  • استخدام الترتيب الفقاعي لمجموعات البيانات الكبيرة في التطبيقات الحقيقية.

  • الاعتقاد بأن الترتيب الفقاعي فعال لأنه سهل الكتابة.

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

متى يجب استخدام الترتيب الفقاعي؟

الترتيب الفقاعي مفيد بشكل أساسي للتعلم والتعليم. يساعد المبتدئين على فهم كيفية عمل الترتيب داخليًا وكيف يمكن تحليل الخوارزميات.

قد يكون الترتيب الفقاعي مقبولاً عندما:

  • مجموعة البيانات صغيرة جدًا.

  • المصفوفة مرتبة بالفعل أو شبه مرتبة.

  • الهدف تعليمي، وليس قائمًا على الأداء.

  • تريد إظهار التبديل والحلقات المتداخلة.

  • تريد شرح التعقيد في أفضل الحالات والمتوسطة والأسوأ.

في المشاريع الاحترافية، يستخدم المطورون عادةً دوال الترتيب المدمجة أو خوارزميات أكثر كفاءة بدلاً من الترتيب الفقاعي.

متى لا يجب استخدام الترتيب الفقاعي؟

لا ينبغي استخدام الترتيب الفقاعي عندما يكون الأداء مهمًا. يصبح بطيئًا مع نمو حجم المدخلات لأن تعقيده الزمني في الحالة المتوسطة والأسوأ هو O(n²).

تجنب الترتيب الفقاعي عندما:

  • تحتوي مجموعة البيانات على العديد من العناصر.

  • يتطلب التطبيق ترتيبًا سريعًا.

  • يتم تشغيل الكود بشكل متكرر في بيئة الإنتاج.

  • تؤثر عملية الترتيب على تجربة المستخدم.

  • تتوفر دالة ترتيب محسّنة مدمجة.

على سبيل المثال، في PHP، تعد الدوال مثل sort()، و usort()، و asort()، و ksort() عادةً خيارات أفضل للمشاريع الحقيقية.

مقارنة الترتيب الفقاعي بخوارزميات ترتيب أفضل

الترتيب الفقاعي بسيط، لكنه لا ينافس خوارزميات الترتيب الأكثر كفاءة. عادةً ما تكون خوارزميات مثل Merge Sort (الدمج)، و Quick Sort (الفرز السريع)، و Heap Sort (الترتيب الكومي) أسرع بكثير لمجموعات البيانات الأكبر.

الخوارزميةمتوسط التعقيد الزمنيالاستخدام الشائع
الترتيب الفقاعيO(n²)للتعلم، أمثلة صغيرة
الترتيب بالاختيارO(n²)ترتيب تعليمي بسيط
الترتيب بالإدراجO(n²)بيانات صغيرة أو شبه مرتبة
الترتيب بالدمجO(n log n)ترتيب مستقر بأداء متوقع
الفرز السريعO(n log n) averageترتيب سريع للأغراض العامة

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

الترتيب الفقاعي ورموز Big O

الترتيب الفقاعي هو مثال عملي لفهم رموز Big O. لا تقيس Big O وقت التنفيذ الدقيق بالثواني. بدلاً من ذلك، تصف كيفية نمو عدد العمليات مع زيادة حجم المدخلات.

بالنسبة للمصفوفات الصغيرة، قد يبدو الترتيب الفقاعي سريعًا. ولكن عندما يزداد حجم المدخلات، يزداد عدد المقارنات بسرعة.

حجم المدخلاتالمقارنات التقريبية
10 عناصر45 مقارنة
100 عنصر4,950 مقارنة
1,000 عنصر499,500 مقارنة
10,000 عنصر49,995,000 مقارنة

يوضح هذا النمو سبب قدرة خوارزميات O(n²) على أن تصبح مكلفة بسرعة.

قائمة مراجعة عملية لفهم الترتيب الفقاعي

قبل الانتقال إلى خوارزميات ترتيب أكثر تقدمًا، تأكد من فهمك للنقاط التالية:

  • يقارن الترتيب الفقاعي العناصر المتجاورة.

  • يبدل العناصر عندما تكون في ترتيب خاطئ.

  • بعد كل تمريرة، يصل عنصر واحد إلى موضعه النهائي المرتب.

  • تصبح الحلقة الداخلية أقصر بعد كل تمريرة.

  • يمكن للإصدار المحسّن التوقف مبكرًا إذا لم تحدث أي تبديلات.

  • التعقيد الزمني في أفضل الحالات هو O(n) فقط مع التحسين.

  • التعقيد الزمني في الحالة المتوسطة والأسوأ هو O(n²).

  • التعقيد المكاني هو O(1).

  • الترتيب الفقاعي مستقر عندما لا يتم تبديل العناصر المتساوية.

  • الترتيب الفقاعي مفيد بشكل أساسي للتعلم، وليس لمجموعات البيانات الكبيرة في الإنتاج.

الخاتمة

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

يوضح التنفيذ اليدوي كيف تتحرك القيم الأكبر تدريجيًا إلى نهاية المصفوفة بعد كل تمريرة. يعمل الإصدار المحسّن على تحسين الأداء في أفضل الحالات من خلال التوقف مبكرًا عندما لا تكون هناك حاجة للتبديلات.

من منظور التعقيد، يمتلك الترتيب الفقاعي تعقيدًا زمنيًا في أفضل الحالات يبلغ O(n) عند تحسينه، لكن تعقيده الزمني في الحالة المتوسطة والأسوأ هو O(n²). تعقيده المكاني هو O(1) لأنه يمكنه ترتيب البيانات في مكانها باستخدام كمية صغيرة فقط من الذاكرة الإضافية.

في مشاريع البرمجيات الحقيقية، نادرًا ما يكون الترتيب الفقاعي هو الخيار الأفضل للأداء. ومع ذلك، فإنه يظل خوارزمية تعليمية ممتازة لأنه يعلم أساسيات الترتيب ويهيئ المطورين لفهم خوارزميات أكثر تقدمًا مثل Insertion Sort، و Merge Sort، و Quick Sort، و Heap Sort.