שיעורי מודול (5/5)
מיון עם חבילת המיון
החבילה הסטנדרטית sort ממיין פרוסות במקום. לסוגי בסיס
(int, float64, string) יש עוזרים ישירים; לכל פרוסה אחרת שאתה
השתמש ב-sort.Slice עם פונקציה less(i, j int) bool המגדירה את
הזמנה.
עוזרים לסוגי בסיס
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:
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:
sort.SliceStable(people, func(i, j int) bool {
return people[i].Age < people[j].Age
})מיון לפי מספר מקשים
דפוס נפוץ: מיון לפי גיל, ולגילאים שווים לפי שם:
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 עבודה על פרוסות שכבר ממוינות:
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5) // 2אם האלמנט לא קיים, הוא מחזיר את אינדקס ההוספה. אתה יכול לחפור לפרטים כאשר אתה צריך אותם.
כללי (Go 1.21+): slices.Sort
מחבילת slices ב-stdlib (Go 1.21):
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 אבל יותר
ארגונומי.
נסה את זה
מיין מספרים בסדר עולה באמצעות sort.Ints.
הצג רמז
`sort.Ints` ממיין פרוסת אינט במקום.
הפתרון זמין לאחר 3 ניסיונות
מיין אנשים לפי גיל בסדר עולה באמצעות sort.Slice.
הצג רמז
הפונקציה less מחזירה true כאשר אלמנט i אמור להגיע לפני j.
הפתרון זמין לאחר 3 ניסיונות
איך ממיינים בסדר יורד עם sort.Slice?
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). - למפתחות המפה: לחלץ לפרוסה ולמיין.