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

Merge Sort

آخر تحديث

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

لأنه يقسم دائمًا إلى نصفين، يعمل فرز الدمج بزمن O(n log n) في كل الحالات - وأسوأ حالاته جيدة كأفضلها. المقابل هو مساحة إضافية O(n) للمخزن المؤقت للدمج.

تعقيد الوقت والمساحة

الحالةالتعقيدملاحظات
أفضل حالةO(n log n)يقسم المدخل دائمًا إلى نصفين
الحالة المتوسطةO(n log n)ترتيب عشوائي
أسوأ حالةO(n log n)مضمون - لا توجد مدخلات سيئة
المساحةO(n)مخزن مؤقت للدمج
مستقرنعمتُحل التعادلات لصالح اليسار أثناء الدمج

خطوة بخطوة

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

مثال محلول

فرز [5, 2, 4, 1]:

التمريرةالمصفوفةالإجراء
تقسيم[5, 2] | [4, 1]قسّم المصفوفة إلى نصفين
تقسيم[5] [2] | [4] [1]قسّم مرة أخرى حتى يصبح كل جزء عنصرًا واحدًا
دمج[2, 5] | [1, 4]ادمج [5],[2] إلى [2, 5] و [4],[1] إلى [1, 4]
دمج[1, 2, 4, 5]ادمج [2, 5] و [1, 4]: اختر 1، ثم 2، ثم 4، ثم 5
تم[1, 2, 4, 5]المصفوفة مرتبة بالكامل

متى تستخدم فرز الدمج

استخدمه عندماتجنّبه عندما
تحتاج إلى أسوأ حالة مضمونة O(n log n)الذاكرة محدودة ومساحة إضافية O(n) غير مقبولة
الاستقرار مهم (المفاتيح المتساوية تحافظ على ترتيبها)ترتّب مصفوفات صغيرة يكون فيها فرز الإدراج أسرع
ترتّب قائمة مترابطةالفرز في المكان شرط صارم
البيانات أكبر من أن تتسع في الذاكرة (فرز خارجي)تهيمن محلية الذاكرة المؤقتة وتتفوق تمريرات quicksort في المكان

كود Merge Sort

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

كود Merge Sort بلغة Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
شغّل هذا الكود في ساحة تجربة Python

الأسئلة الشائعة حول فرز الدمج

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

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

ابدأ الآن