Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الترتيب بالإدراج

آخر تحديث

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

الترتيب بالإدراج سريع جدًا على المدخلات الصغيرة أو شبه المرتبة - إذ يعمل في O(n) عندما تكون البيانات مرتبة بالفعل - ولهذا تلجأ إليه العديد من خوارزميات الترتيب الهجينة للمصفوفات الفرعية الصغيرة.

التعقيد الزمني والمكاني

الحالةالتعقيدملاحظات
أفضل حالةO(n)مرتبة بالفعل
الحالة المتوسطةO(n²)ترتيب عشوائي
أسوأ حالةO(n²)مرتبة عكسيًا
المساحةO(1)في المكان
مستقرنعمالعناصر المتساوية تحتفظ بترتيبها النسبي

خطوة بخطوة

الخطوةماذا يحدث
1اعتبر العنصر الأول منطقة مرتبة بحجم واحد.
2خذ العنصر التالي كمفتاح.
3أزح كل عنصر مرتب أكبر من المفتاح خانة واحدة إلى اليمين.
4أدرج المفتاح في الفجوة المفتوحة.
5كرر حتى يتم إدراج كل عنصر.

مثال محلول

ترتيب [5, 2, 4, 1]:

التمريرةالمصفوفةالإجراء
البداية[5, 2, 4, 1]5 هي المنطقة المرتبة الأولية بحجم واحد.
1[2, 5, 4, 1]المفتاح 2: أزح 5 إلى اليمين، أدرج 2 في المقدمة.
2[2, 4, 5, 1]المفتاح 4: أزح 5 إلى اليمين، 2 أصغر فتوقف، أدرج 4.
3[1, 2, 4, 5]المفتاح 1: أزح 5 و4 و2 إلى اليمين، أدرج 1 في المقدمة.
انتهى[1, 2, 4, 5]تم إدراج كل العناصر؛ المصفوفة مرتبة.

متى تستخدم الترتيب بالإدراج

استخدمه عندماتجنّبه عندما
تكون المصفوفة صغيرة (تقريبًا n < 20).تكون المصفوفة كبيرة ومرتبة عشوائيًا.
تكون البيانات شبه مرتبة بالفعل، مما يعطي أفضل حالة O(n).تحتاج إلى أسوأ حالة مضمونة بـ O(n log n).
تحتاج إلى ترتيب مستقر في المكان بمساحة إضافية O(1).يكون نقل العناصر مكلفًا، لأنه يجري الكثير من عمليات الإزاحة.
تصل البيانات تدريجيًا ويجب أن تبقى مرتبة بشكل متصل.يكون الإدخال مرتبًا عكسيًا، وهي أسوأ حالة O(n²).

كود Insertion Sort

تنفيذ نظيف وقابل للتشغيل لخوارزمية Insertion Sort بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.

كود Insertion Sort بلغة Python

Python
1def insertion_sort(a):2    for i in range(1, len(a)):3        key = a[i]4        j = i - 15        # Shift larger elements one slot to the right6        while j >= 0 and a[j] > key:7            a[j + 1] = a[j]8            j -= 19        a[j + 1] = key10    return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)
شغّل هذا الكود في ساحة تجربة Python

الأسئلة الشائعة حول الترتيب بالإدراج

ما هو التعقيد الزمني للترتيب بالإدراج؟
الترتيب بالإدراج هو O(n²) في المتوسط وفي أسوأ الحالات، لكنه O(n) على مصفوفة مرتبة بالفعل أو شبه مرتبة. يستخدم مساحة إضافية O(1).
هل الترتيب بالإدراج مستقر؟
نعم. يزيح الترتيب بالإدراج فقط العناصر الأكبر تمامًا من المفتاح، لذا لا تتجاوز العناصر المتساوية بعضها أبدًا ويُحفظ ترتيبها النسبي.
متى ينبغي أن أستخدم الترتيب بالإدراج؟
استخدمه للمصفوفات الصغيرة أو البيانات شبه المرتبة بالفعل. بسبب انخفاض تكلفته الإضافية وأفضل حالة تكيفية له، تستخدمه الخوارزميات الهجينة مثل Timsort للمقاطع الصغيرة.
ما الفرق بين الترتيب بالإدراج والترتيب الفقاعي؟
كلاهما ترتيب بالمقارنة بتعقيد O(n²)، لكن الترتيب بالإدراج يزيح العناصر لفتح فجوة للمفتاح، بينما يبدّل الترتيب الفقاعي مرارًا الأزواج المتجاورة غير المرتبة. عادةً ما يجري الترتيب بالإدراج عمليات كتابة أقل ويؤدي أداءً أفضل عمليًا، خصوصًا على البيانات شبه المرتبة حيث يبلغ أفضل حالة O(n).
لماذا يكون الترتيب بالإدراج أسرع من الترتيب بالدمج على المصفوفات الصغيرة؟
الترتيب بالإدراج له تكلفة إضافية ثابتة منخفضة جدًا وبلا تكرار عودي أو تخصيص ذاكرة إضافي، لذا يتفوق على خوارزميات الترتيب O(n log n) على المدخلات الصغيرة رغم تعقيده المقارب الأسوأ. لهذا السبب بالذات تتحول خوارزميات الترتيب الهجينة مثل Timsort وintrosort إلى الترتيب بالإدراج للمصفوفات الفرعية الصغيرة.
هل يعمل الترتيب بالإدراج بشكل أفضل مع قائمة مترابطة أم مع مصفوفة؟
يُكتب الترتيب بالإدراج عادةً للمصفوفات، حيث تكون إزاحة العناصر هي التكلفة الرئيسية. في القائمة المترابطة تتجنب الإزاحة بوصل العقدة في مكانها، لكنك تفقد الوصول العشوائي السريع، لذا يظل إيجاد نقطة الإدراج يستغرق زمنًا خطيًا لكل عنصر وتبقى التكلفة الإجمالية O(n²).
Coddy programming languages illustration

أتقن الخوارزميات مع Coddy

ابدأ الآن