الفرز والتقسيم: sort وstable_partition
افرز الحاويات وقسّمها باستخدام std::sort وstd::stable_partition.
الفرز والتقسيم: sort وstable_partition درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
std::sort
خوارزمية الفرز الأساسية. التعقيد المتوسط O(N log N). تعمل موضعيًا. ولا تضمن الاستقرار.
#include <algorithm>
std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};
std::sort(v.begin(), v.end());
// v is sorted ascendingمقارن مخصص
مرّر مقارنًا (لامبدا أو functor) لإجراء الفرز وفق معايير أخرى.
std::sort(v.begin(), v.end(),
[](int a, int b) { return a > b; }); // descendingفرز الأنواع المخصصة
قدّم مقارنًا يقارن أعضاء محددين، أو عرّف operator< للنوع.
struct Person { std::string name; int age; };
std::vector<Person> people;
std::sort(people.begin(), people.end(),
[](const Person& a, const Person& b) { return a.age < b.age; });std::stable_sort
مثل sort، لكنها تحافظ على الترتيب النسبي للعناصر المتساوية. أبطأ قليلًا، وعادةً ما تتطلب ذاكرة إضافية O(N log^2 N).
std::partial_sort
ضع أصغر عناصر k أولًا بترتيب فرز. تكون العناصر المتبقية بترتيب غير محدد. وهي أسرع من الفرز الكامل عندما تحتاج فقط إلى أعلى k من العناصر.
std::vector<int> v = {5, 2, 8, 1, 9, 3};
std::partial_sort(v.begin(), v.begin() + 3, v.end());
// first 3 elements are the smallest, sortedstd::nth_element
قسّم النطاق بحيث يكون العنصر عند الموضع nth هو العنصر الذي سيقع في ذلك الموضع ضمن نطاق مرتب بالكامل. كل ما قبله ≤ nth، وكل ما بعده ≥. التعقيد المتوسط O(N).
std::nth_element(v.begin(), v.begin() + 2, v.end());
// v[2] is the 3rd smallest elementstd::is_sorted
تحقّق مما إذا كان النطاق مرتبًا مسبقًا.
if (std::is_sorted(v.begin(), v.end())) {
std::cout << "already sorted";
}std::partition
أعد ترتيب النطاق بحيث تأتي العناصر التي تحقق دالة شرطية أولًا. تعيد الخوارزمية المكرّر الذي يشير إلى أول عنصر لا يحقق الشرط. ولا تحافظ على الاستقرار.
std::vector<int> v = {1, 2, 3, 4, 5};
auto pivot = std::partition(v.begin(), v.end(),
[](int x) { return x % 2 == 0; });
// even numbers come first, then oddstd::stable_partition
مثل partition، لكنها تحافظ على الترتيب النسبي داخل كل مجموعة.
الفرز وفق مفاتيح متعددة
استخدم مقارنًا يقارن المفتاح الأساسي، ثم المفتاح الثانوي إذا تساوى المفتاح الأساسي.
std::sort(people.begin(), people.end(),
[](const Person& a, const Person& b) {
if (a.age != b.age) return a.age < b.age;
return a.name < b.name;
});البحث الثنائي في النطاقات المرتبة
بعد الفرز، استخدم std::lower_bound وstd::upper_bound وstd::binary_search لإجراء عمليات بحث بتعقيد O(log N).
اختبار سريع
أي خوارزمية تحافظ على الترتيب النسبي للعناصر المتساوية بعد الفرز؟
مراجعة
استخدم std::sort للفرز العام، وstd::stable_sort عندما يكون ترتيب العناصر المتساوية مهمًا، وstd::partial_sort للحصول على أعلى k من العناصر، وstd::nth_element للاختيار، وstd::partition/std::stable_partition للتجميع.
تعلم C++ مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «الفرز والتقسيم: sort وstable_partition» مجاني؟
نعم — نص درس «الفرز والتقسيم: sort وstable_partition» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «الفرز والتقسيم: sort وstable_partition»؟
افرز الحاويات وقسّمها باستخدام std::sort وstd::stable_partition. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الفرز والتقسيم: sort وstable_partition»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الخوارزميات غير المعدِّلة: find وcount وall_of
- الخوارزميات المعدِّلة: transform وcopy_if وreplace
- الفرز والتقسيم: sort وstable_partition
- الخوارزميات الرقمية: accumulate وreduce وtransform_reduce