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

Heap Sort

آخر تحديث

يتعامل فرز الكومة مع المصفوفة كأنها كومة ثنائية. أولًا يبني max-heap بحيث يقع أكبر عنصر في الجذر (الفهرس 0). ثم يبادل الجذر مرارًا مع آخر عنصر غير مرتّب - مثبّتًا القيمة القصوى في مكانها - ويُنزل الجذر الجديد للأسفل لاستعادة خاصية الكومة. اضغط تشغيل في الأعلى لمشاهدة بناء الكومة وعمليات الاستخراج.

يضمن فرز الكومة زمنًا قدره O(n log n) مثل فرز الدمج، لكنه يرتّب في المكان مستخدمًا مساحة إضافية قدرها O(1) فقط. وهو غير مستقر ويميل إلى أداء ذاكرة مؤقتة (cache) أسوأ من الفرز السريع، لذا يُختار غالبًا عندما يهم كل من الحد المضمون والذاكرة الثابتة معًا.

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

الحالةالتعقيدملاحظات
أفضل حالةO(n log n)البناء + n عمليات استخراج
الحالة المتوسطةO(n log n)ترتيب عشوائي
أسوأ حالةO(n log n)مضمون
المساحةO(1)في المكان
مستقرلاالإنزال يعيد ترتيب العناصر المتساوية

خطوة بخطوة

الخطوةماذا يحدث
1بناء max-heap من المصفوفة (الإنزال بدءًا من آخر أب).
2مبادلة الجذر (القيمة القصوى) مع آخر عنصر في الكومة.
3تقليص الكومة بمقدار واحد - ذلك الموضع الأخير أصبح مرتّبًا الآن.
4إنزال الجذر الجديد للأسفل لاستعادة خاصية max-heap.
5التكرار حتى يتبقى في الكومة عنصر واحد.

مثال محلول

فرز [3, 1, 6, 5, 2, 4]. الشريط | يعلّم الحد الفاصل بين الكومة المتقلّصة والذيل المرتّب:

التمريرةالمصفوفةالإجراء
بناء الكومة[6, 5, 4, 1, 2, 3]الإنزال بدءًا من آخر أب لبناء max-heap؛ أصبح 6 الآن في الجذر.
1[5, 3, 4, 1, 2 | 6]مبادلة الجذر 6 مع الموضع الأخير، وتقليص الكومة، وإنزال 3.
2[4, 3, 2, 1 | 5, 6]إخراج الجذر 5، ثم إنزال 2 كي يصعد 4 إلى الجذر.
3[3, 1, 2 | 4, 5, 6]إخراج الجذر 4، ثم إنزال 1 كي يصعد 3 إلى الجذر.
4[2, 1 | 3, 4, 5, 6]إخراج الجذر 3؛ العنصر 2 يحقق خاصية الكومة بالفعل.
5[1 | 2, 3, 4, 5, 6]إخراج الجذر 2؛ يتبقى عنصر واحد، لذا أصبحت المصفوفة مرتّبة.

متى تستخدم فرز الكومة

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

كود Heap Sort

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

كود Heap Sort بلغة Python

Python
1def heap_sort(a):2    n = len(a)3    # Build a max-heap, deepest parent first4    for i in range(n // 2 - 1, -1, -1):5        sift_down(a, i, n)6    # Repeatedly move the max to the end and shrink the heap7    for end in range(n - 1, 0, -1):8        a[0], a[end] = a[end], a[0]9        sift_down(a, 0, end)10    return a11
12
13def sift_down(a, i, size):14    while True:15        largest = i16        left, right = 2 * i + 1, 2 * i + 217        if left < size and a[left] > a[largest]:18            largest = left19        if right < size and a[right] > a[largest]:20            largest = right21        if largest == i:22            return23        a[i], a[largest] = a[largest], a[i]24        i = largest25
26
27nums = [12, 11, 13, 5, 6, 7]28print("Before:", nums)29heap_sort(nums)30print("After: ", nums)
شغّل هذا الكود في ساحة تجربة Python

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

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

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

ابدأ الآن