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

Quick Sort

آخر تحديث

الترتيب السريع خوارزمية «فرّق تسُد» تُرتِّب حول «محور». تختار عنصرًا محوريًا، ثم تقسّم المصفوفة بحيث يأتي كل ما هو أصغر قبله وكل ما هو أكبر بعده - مما يثبّت المحور في موضعه النهائي المرتّب. ثم تُكرِّر على القسمين الأيسر والأيمن. يستخدم هذا التصور مخطط Lomuto مع العنصر الأخير كمحور. اضغط تشغيل لمشاهدة التقسيم ووضع المحور.

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

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

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

خطوة بخطوة

الخطوةما الذي يحدث
1اختر محورًا (هنا، العنصر الأخير من المدى).
2التقسيم: انقل إلى يساره كل العناصر الأصغر من المحور.
3بادل المحور إلى الحد الفاصل - أصبح الآن في موضعه النهائي.
4طبّق الترتيب السريع عوديًا على القسم الأيسر.
5طبّق الترتيب السريع عوديًا على القسم الأيمن.

مثال محلول

ترتيب [5, 2, 4, 1] باستخدام مخطط Lomuto (العنصر الأخير كمحور):

التمريرةالمصفوفةالإجراء
البداية[5, 2, 4, 1]قسّم المدى كاملًا؛ المحور هو 1 (العنصر الأخير).
1[1, 2, 4, 5]لا شيء أصغر من 1، لذا بادل 1 إلى الفهرس 0؛ أصبح المحور 1 نهائيًا. كرّر يمينًا على [2, 4, 5].
2[1, 2, 4, 5]قسّم [2, 4, 5] بالمحور 5؛ كلٌّ من 2 و4 أصغر، لذا يبقى 5 في النهاية ويصبح نهائيًا. كرّر يسارًا على [2, 4].
3[1, 2, 4, 5]قسّم [2, 4] بالمحور 4؛ 2 أصغر، لذا يبقى 4 في مكانه ويصبح نهائيًا. 2 عنصر مفرد، لذا فهو مرتّب بالفعل.
انتهى[1, 2, 4, 5]كل محور مثبّت في مكانه؛ المصفوفة مرتّبة.

متى تستخدم الترتيب السريع

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

كود Quick Sort

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

كود Quick Sort بلغة Python

Python
1def quick_sort(a, low=0, high=None):2    if high is None:3        high = len(a) - 14    if low < high:5        p = partition(a, low, high)6        quick_sort(a, low, p - 1)7        quick_sort(a, p + 1, high)8    return a9
10
11def partition(a, low, high):12    # Lomuto partition: everything < pivot moves left of it13    pivot = a[high]14    i = low15    for j in range(low, high):16        if a[j] < pivot:17            a[i], a[j] = a[j], a[i]18            i += 119    a[i], a[high] = a[high], a[i]20    return i21
22
23nums = [10, 7, 8, 9, 1, 5]24print("Before:", nums)25quick_sort(nums)26print("After: ", nums)
شغّل هذا الكود في ساحة تجربة Python

أسئلة شائعة حول Quick Sort

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

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

ابدأ الآن