الفَرز السريع (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) هي أداة قوية في ترسانة أي مبرمج. تعلمها وفهمها بعمق يمكن أن يفتح لك آفاقًا جديدة في عالم تطوير البرمجيات. لا تخف من التجربة والتعديل على الكود لتناسب احتياجاتك. تذكر دائمًا: البرمجة هي فن، والفرز السريع هو أحد روائعها! ✨

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

أبو عمر

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

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

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

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

آخر المدونات

التوظيف وبناء الهوية التقنية

سيرتي الذاتية عبرت فلتر الـ ATS لكنها فشلت أمام المدير التقني: كيف أعدت بناءها لتتحدث لغة المهندسين؟

من واقع تجربة شخصية، أسرد لك كيف تحوّل سيرتك الذاتية من مجرد قائمة مهارات يتجاهلها المديرون التقنيون إلى قصة إنجازات مُقنعة تفتح لك أبواب المقابلات....

28 فبراير، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

خدمة واحدة فاشلة كادت أن تسقط النظام بأكمله: كيف أنقذني نمط ‘قاطع الدائرة’ (Circuit Breaker) من كارثة متتالية؟

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

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

لقد ‘هاجمت’ تطبيقي بنفسي عمداً: كيف كشفت لي ‘هندسة الفوضى’ نقاط الضعف التي لم تظهرها الاختبارات التقليدية

أشارككم قصة حقيقية حول إطلاق فاشل كاد أن يدمر سمعتنا، وكيف قادتنا هذه التجربة المريرة إلى تبني "هندسة الفوضى" (Chaos Engineering). اكتشفوا معنا كيف يمكن...

26 فبراير، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

عاصفة من الطلبات كادت أن تغرق تطبيقي: كيف أنقذتني طوابير الرسائل (Message Queues) من كارثة الجمعة السوداء؟

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

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