דילוג לתוכן המרכזי
מודול 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)

כדי למיין הפוך, פשוט הפוך את ההשוואה: return people[i].Age > people[j].Age.

מיון יציב

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

אם האלמנט לא קיים, הוא מחזיר את אינדקס ההוספה. אתה יכול לחפור לפרטים כאשר אתה צריך אותם.

כללי (Go 1.21+): slices.Sort

מחבילת slices ב-stdlib (Go 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
})

API מודרני יותר ובטוח סוגים. תואם עם sort.Slice אבל יותר ארגונומי.

נסה את זה

פעילות גופנית#go.m4.l5.e1
ניסיונות: 0טוען...

מיין מספרים בסדר עולה באמצעות sort.Ints.

טוען עורך...
הצג רמז

`sort.Ints` ממיין פרוסת אינט במקום.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m4.l5.e2
ניסיונות: 0טוען...

מיין אנשים לפי גיל בסדר עולה באמצעות sort.Slice.

טוען עורך...
הצג רמז

הפונקציה less מחזירה true כאשר אלמנט 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 עם API גנרי (slices.Sort, slices.SortFunc).
  • למפתחות המפה: לחלץ לפרוסה ולמיין.