الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 5 من 520/50 في الدورة~10 min
دروس الوحدة (5/5)

الفرز باستخدام حزمة الفرز

تقوم الحزمة القياسية sort بفرز الشرائح في مكانها. للأنواع الأساسية (int، float64، string) هناك مساعدين مباشرين؛ لأي شريحة أخرى لك استخدم sort.Slice مع وظيفة less(i, j int) bool التي تحدد الطلب.

مساعدين للأنواع الأساسية

Go
import "sort"

nums := []int{5, 2, 8, 1}
sort.Ints(nums)        // [1 2 5 8]

words := []string{"c", "a", "b"}
sort.Strings(words)    // [a b c]

fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs)      // [0.5 1.5 2.5]

يتم الفرز في المكان: يتم تغيير الشريحة الأصلية.

sort.Slice: فرز مخصص

قمت بتمرير الشريحة ووظيفة less، مع وجود مؤشرين i و j، يتم إرجاع true إذا كان العنصر i يجب أن يأتي قبل j:

Go
type Person struct {
    Name string
    Age  int
}

people := []Person{
    {"Bruno", 30},
    {"Anna", 25},
    {"Carla", 28},
}

sort.Slice(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)

للفرز في الاتجاه المعاكس، ما عليك سوى قلب المقارنة: محمي_INLINE_14.

نوع مستقر

sort.Slice ليس مضمونًا أن يكون مستقرًا (قد تتغير العناصر المتساوية). الترتيب النسبي). للحصول على فرز مستقر، استخدم sort.SliceStable:

Go
sort.SliceStable(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})

الفرز حسب مفاتيح متعددة

النمط الشائع: الفرز حسب العمر، وللأعمار المتساوية حسب الاسم:

Go
sort.Slice(people, func(i, j int) bool {
    if people[i].Age != people[j].Age {
        return people[i].Age < people[j].Age
    }
    return people[i].Name < people[j].Name
})

بحث ثنائي

sort.SearchInts / sort.Search يعمل على الشرائح التي تم فرزها بالفعل:

Go
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5)   // 2

إذا لم يكن العنصر موجودًا، فإنه يُرجع فهرس الإدراج. يمكنك الحفر في التفاصيل عندما تحتاج إليها.

الأدوية العامة (الإصدار 1.21+): slices.Sort

من الحزمة slices في stdlib (انتقل إلى 1.21):

Go
import "slices"

nums := []int{3, 1, 2}
slices.Sort(nums)               // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
    return a.Age - b.Age        // -1/0/1
})

واجهة برمجة تطبيقات أكثر حداثة وآمنة من حيث النوع. متوافق مع sort.Slice ولكن أكثر من ذلك مريح.

جربه

تمرين#go.m4.l5.e1
المحاولات: 0جارٍ التحميل…

فرز الأرقام بترتيب تصاعدي باستخدامsort.Ints.

جارٍ تحميل المحرر…
إظهار التلميح

يقوم `sort.Ints' بفرز شريحة int في مكانها.

الحل متاح بعد 3 من المحاولات

تمرين#go.m4.l5.e2
المحاولات: 0جارٍ التحميل…

فرز الأشخاص حسب العمر بترتيب تصاعدي باستخدامsort.Slice.

جارٍ تحميل المحرر…
إظهار التلميح

ترجع الدالة less صحيحًا عندما يأتي العنصر i قبل j.

الحل متاح بعد 3 من المحاولات

Quiz#go.m4.l5.e3
جاهز

كيف يمكنك الفرز بترتيب تنازلي باستخدامsort.Slice؟

Go
sort.Slice(s, func(i, j int) bool { return ??? })
خيارات الإجابة

خلاصة

  • sort.Ints / sort.Strings / sort.Float64s للأنواع الأساسية، في مكانها.
  • sort.Slice(s, less) للشرائح من أي نوع، مع وظيفة less(i, j).
  • sort.SliceStable للحفاظ على الترتيب النسبي للمفاتيح المتساوية.
  • الترتيب حسب مفاتيح متعددة: سلسلة من ifs داخل less.
  • انتقل إلى الإصدار 1.21+: slices الحزمة مع واجهة برمجة التطبيقات العامة (slices.Sort، slices.SortFunc).
  • بالنسبة لمفاتيح الخريطة: قم باستخراجها إلى شريحة وفرزها.