الفَرز السريع (QuickSort): دليل شامل من أرض الزيتون إلى عالم الخوارزميات 🫒

استمع للبودكاست حوار شيق بين لمى وأبو عمر
0:00 / 0:00

الفَرز السريع (QuickSort): دليل شامل من أرض الزيتون إلى عالم الخوارزميات 🫒

بتذكر مرة، كنت شغال على مشروع تحليل بيانات ضخم لشركة أدوية في غزة. البيانات كانت بتيجي بكميات رهيبة، والوقت كان ضاغط. جربت كل طرق الفرز اللي بعرفها، بس ولا وحدة أعطتني النتيجة اللي بدي اياها بالسرعة المطلوبة. وقتها، تذكرت خوارزمية الفرز السريع (QuickSort) اللي درستها بالجامعة. قلت لحالي: “يا زلمة، خلينا نجربها، شو خسرانين؟” وفعلاً، لما طبقتها، فرقت معي كتير! المشروع مشي بسرعة وصار أداء البرنامج أحسن بكتير. من وقتها، صرت أعتمد على QuickSort في كتير من مشاريعي.

ما هي خوارزمية الفرز السريع (QuickSort)؟

خوارزمية الفرز السريع (QuickSort) هي خوارزمية فرز تعتمد على مبدأ “فرق تسد” (Divide and Conquer). الفكرة الأساسية هي اختيار عنصر محوري (pivot) من المصفوفة، ثم تقسيم المصفوفة إلى قسمين: قسم يحتوي على عناصر أصغر من العنصر المحوري، وقسم يحتوي على عناصر أكبر من العنصر المحوري. بعد ذلك، يتم تطبيق نفس العملية بشكل تكراري على القسمين حتى يتم فرز المصفوفة بالكامل.

آلية عمل خوارزمية الفرز السريع

  1. اختيار العنصر المحوري (Pivot): يتم اختيار عنصر من المصفوفة ليكون العنصر المحوري. يمكن اختيار العنصر المحوري بشكل عشوائي، أو اختيار العنصر الأول أو الأخير في المصفوفة.
  2. التقسيم (Partitioning): يتم تقسيم المصفوفة إلى قسمين، قسم يحتوي على عناصر أصغر من العنصر المحوري، وقسم يحتوي على عناصر أكبر من العنصر المحوري. يتم وضع العنصر المحوري في مكانه الصحيح في المصفوفة.
  3. التكرار (Recursion): يتم تطبيق نفس العملية بشكل تكراري على القسمين حتى يتم فرز المصفوفة بالكامل.

مثال عملي بلغة بايثون

هذا مثال بسيط لكيفية تطبيق خوارزمية الفرز السريع بلغة بايثون:


def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x  pivot]
    return quicksort(left) + middle + quicksort(right)

# مثال للاستخدام
my_array = [12, 4, 5, 6, 7, 3, 1, 15]
sorted_array = quicksort(my_array)
print("المصفوفة الأصلية:", my_array)
print("المصفوفة بعد الفرز:", sorted_array)

شرح الكود:

  • الدالة quicksort(arr) تستقبل مصفوفة arr كمدخل.
  • إذا كانت طول المصفوفة أقل من أو تساوي 1، يتم إرجاع المصفوفة كما هي (لأنها تعتبر مفروزة).
  • يتم اختيار العنصر المحوري pivot من منتصف المصفوفة.
  • يتم إنشاء ثلاث قوائم: left (عناصر أصغر من المحور)، middle (عناصر تساوي المحور)، و right (عناصر أكبر من المحور).
  • يتم استدعاء الدالة quicksort() بشكل تكراري على القائمتين left و right.
  • يتم دمج القوائم الثلاث left، middle، و right لإرجاع المصفوفة المفروزة.

تحليل أداء خوارزمية الفرز السريع

يعتمد أداء خوارزمية الفرز السريع على كيفية اختيار العنصر المحوري. في أفضل الحالات ومتوسط الحالات، يكون أداء الخوارزمية O(n log n). أما في أسوأ الحالات، يكون أداء الخوارزمية O(n^2).

  • أفضل الحالات: عندما يتم اختيار العنصر المحوري بحيث يقسم المصفوفة إلى قسمين متساويين تقريبًا.
  • متوسط الحالات: عندما يتم اختيار العنصر المحوري بشكل عشوائي.
  • أسوأ الحالات: عندما تكون المصفوفة مرتبة بالفعل، ويتم اختيار العنصر الأول أو الأخير كعنصر محوري.

نصائح لتحسين أداء QuickSort

  1. اختيار العنصر المحوري بشكل عشوائي: يقلل من احتمالية الوصول إلى أسوأ الحالات.
  2. استخدام خوارزمية فرز أخرى للمصفوفات الصغيرة: عندما يكون حجم المصفوفة صغيرًا، قد يكون استخدام خوارزمية فرز أبسط مثل Insertion Sort أكثر كفاءة.
  3. التحسينات الداخلية (Tail Recursion Optimization): بعض اللغات تدعم هذا النوع من التحسين الذي يقلل من استهلاك الذاكرة.

متى نستخدم الفرز السريع (QuickSort)؟

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

الخلاصة والنصيحة 💡

خوارزمية الفرز السريع (QuickSort) هي أداة قوية في ترسانة أي مبرمج. تعلمها وفهمها بعمق يمكن أن يفتح لك آفاقًا جديدة في عالم تطوير البرمجيات. لا تخف من التجربة والتعديل على الكود لتناسب احتياجاتك. تذكر دائمًا: البرمجة هي فن، والفرز السريع هو أحد روائعها! ✨

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

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

الحوسبة السحابية

من التوقف التام إلى النجاة: كيف أنقذتنا استراتيجية “الضوء المرشد” (Pilot Light) يوم انقطعت السحابة؟

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

4 يونيو، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كانت مهمتي البرمجية للاختبار مجرد كود: كيف أنقذني توثيق القرارات من جحيم الصمت بعد المقابلة؟

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

4 يونيو، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من الانتظار لأيام إلى الدفع في ثوانٍ: كيف أنقذتنا شبكات الدفع الفوري من جحيم التحويلات البنكية؟

أسرد لكم من واقع تجربتي كـ "أبو عمر"، كيف عانينا من بطء وتكلفة التحويلات البنكية الدولية، وكيف جاءت شبكات الدفع الفوري ومعيار ISO 20022 لتكون...

4 يونيو، 2026 قراءة المزيد
البنية التحتية وإدارة السيرفرات

كان كل خادم لدينا ‘ندفة ثلج’ فريدة: كيف أنقذنا ‘الكود كبنية تحتية’ (IaC) من جحيم الانجراف اليدوي؟

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

4 يونيو، 2026 قراءة المزيد
اختبارات الاداء والجودة

كانت تغطية الاختبارات 100% لكن الأخطاء تتسرب: كيف أنقذنا “الاختبار الطفري” من جحيم الثقة الزائفة؟

كنا نظن أن تغطية الاختبار بنسبة 100% هي درعنا الواقي، لكن الأخطاء كانت تتسلل إلى الإنتاج كاللصوص في ليل بهيم. اكتشف كيف أنقذنا "الاختبار الطفري"...

4 يونيو، 2026 قراءة المزيد
أتمتة العمليات

من كوابيس الحالة المفقودة إلى الأتمتة المنظمة: كيف أنقذتنا محركات سير العمل (Workflow Engines)؟

في هذه المقالة، أشارككم قصة حقيقية عن معاناة فريقنا مع العمليات الطويلة والمعقدة في الأنظمة الموزعة، وكيف كانت محركات تنسيق سير العمل (Workflow Engines) هي...

4 يونيو، 2026 قراءة المزيد
البودكاست