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

فرز الاختيار

آخر تحديث

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

يجري فرز الاختيار دائمًا العدد نفسه من المقارنات بغضّ النظر عن المدخلات، لكنه ينفّذ على الأكثر n-1 من عمليات التبديل - أقل بكثير من فرز الفقاعة - وهو ما يهمّ عندما تكون عمليات الكتابة مكلفة.

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

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

خطوة بخطوة

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

مثال محلول

فرز [5, 2, 4, 1]:

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

متى تستخدم فرز الاختيار

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

كود Selection Sort

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

كود Selection Sort بلغة Python

Python
1def selection_sort(a):2    n = len(a)3    for i in range(n - 1):4        # Find the smallest element in the unsorted tail5        min_idx = i6        for j in range(i + 1, n):7            if a[j] < a[min_idx]:8                min_idx = j9        a[i], a[min_idx] = a[min_idx], a[i]10    return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)
شغّل هذا الكود في ساحة تجربة Python

أسئلة شائعة حول فرز الاختيار

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

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

ابدأ الآن