هل يمكنك شرح ما تفعله هذه الوظائف:
```
مواطن merge_sort(arr):
    إذا لين (arr) <= 1:
        العودة آر

    منتصف = لين (arr) // 2
    left_half = آر [: منتصف]
    right_half = آر[منتصف:]

    left_half = دمج_الفرز(left_half)
    right_half = دمج_الفرز(right_half)

    دمج العودة (left_half، right_half)


دمج ديف (يسار، يمين):
    تم الدمج = []
    مؤشر اليسار = 0
    مؤشر_الصواب = 0

    بينما left_index < len (يسار) و right_index < len (يمين):
        إذا كان اليسار[left_index] <= اليمين[right_index]:
            تم دمجها.إلحاق (يسار[left_index])
            left_index += 1
        آخر:
            تم دمجها.append(يمين[right_index])
            right_index += 1

    بينما left_index < لين (يسار):
        تم دمجها.إلحاق (يسار[left_index])
        left_index += 1

    بينما right_index < لين (يمين):
        تم دمجها.append(يمين[right_index])
        right_index += 1

    عودة مدمجة
```
system
هل يمكنك شرح ما تفعله هذه الوظائف:
```
مواطن merge_sort(arr):
    إذا لين (arr) <= 1:
        العودة آر

    منتصف = لين (arr) // 2
    left_half = آر [: منتصف]
    right_half = آر[منتصف:]

    left_half = دمج_الفرز(left_half)
    right_half = دمج_الفرز(right_half)

    دمج العودة (left_half، right_half)


دمج ديف (يسار، يمين):
    تم الدمج = []
    مؤشر اليسار = 0
    مؤشر_الصواب = 0

    بينما left_index < len (يسار) و right_index < len (يمين):
        إذا كان اليسار[left_index] <= اليمين[right_index]:
            تم دمجها.إلحاق (يسار[left_index])
            left_index += 1
        آخر:
            تم دمجها.append(يمين[right_index])
            right_index += 1

    بينما left_index < لين (يسار):
        تم دمجها.إلحاق (يسار[left_index])
        left_index += 1

    بينما right_index < لين (يمين):
        تم دمجها.append(يمين[right_index])
        right_index += 1

    عودة مدمجة
```
user
يطبق مقتطف التعليمات البرمجية خوارزمية Merge Sort وهي خوارزمية فرز تستخدم أسلوب فرق تسد. تقوم الخوارزمية بشكل متكرر بتقسيم مصفوفة الإدخال إلى صفيفتين فرعيتين، وفرزهما بشكل منفصل ثم دمجهما مرة أخرى بترتيب مفروز. يمكننا مراجعة كل وظيفة لفهم ما تفعله.

1.`merge_sort(arr)`: تأخذ هذه الوظيفة مصفوفة وترجع المصفوفة التي تم فرزها.
  - تحتوي الدالة على حالة أساسية عندما يكون طول مصفوفة الإدخال أقل من أو يساوي 1 نظرًا لأن حجم المصفوفة 1 يعني أنه تم فرزها بالفعل.
  - إذا فشلت الحالة الأساسية، فإننا نواصل الخوارزمية.
  - تعثر الخوارزمية على منتصف المصفوفة وتقسم العناصر إلى نصفين `left_half` و`right_half`.
  - يستدعي `merge_sort` على هذين النصفين ثم يُرجع دمج النصفين اللذين تم فرزهما.

2. `دمج (يسار، يمين)`: تدمج هذه الوظيفة صفيفين مفروزين من اليسار واليمين في صفيف واحد مفروز.
  - يقوم بتهيئة مصفوفة فارغة لتخزين المصفوفة الجديدة ومتغيرين لتخزين الفهرس الحالي لكل مصفوفة.
  - تقوم الخوارزمية بإجراء حلقة زمنية حتى يتم استنفاد مجموعة واحدة من العناصر.
  - داخل الحلقة، يتم تخزين العناصر السفلية الموجودة بين العنصر الأيسر الحالي والعنصر الأيمن الحالي في المصفوفة.
  - بعد اجتياز إحدى المصفوفات بالكامل، تتم إضافة باقي المصفوفة الأخرى إلى المصفوفة.
assistant
system
هل يمكنك شرح ما تفعله هذه الوظائف:
```
مواطن merge_sort(arr):
    إذا لين (arr) <= 1:
        العودة آر

    منتصف = لين (arr) // 2
    left_half = آر [: منتصف]
    right_half = آر[منتصف:]

    left_half = دمج_الفرز(left_half)
    right_half = دمج_الفرز(right_half)

    دمج العودة (left_half، right_half)


دمج ديف (يسار، يمين):
    تم الدمج = []
    مؤشر اليسار = 0
    مؤشر_الصواب = 0

    بينما left_index < len (يسار) و right_index < len (يمين):
        إذا كان اليسار[left_index] <= اليمين[right_index]:
            تم دمجها.إلحاق (يسار[left_index])
            left_index += 1
        آخر:
            تم دمجها.append(يمين[right_index])
            right_index += 1

    بينما left_index < لين (يسار):
        تم دمجها.إلحاق (يسار[left_index])
        left_index += 1

    بينما right_index < لين (يمين):
        تم دمجها.append(يمين[right_index])
        right_index += 1

    عودة مدمجة
```
user
يبدو أن هذه الوظيفة هي تنفيذ خوارزمية فرز الدمج. ومع ذلك، فإنني لا أستطيع فهم كيفية عمله. هل يمكنك شرح كيف تعمل هذه الوظائف؟

```
def merge_sort(arr):
    if len(arr
assistant