मुख्य सामग्री पर जाएं
मॉड्यूल 4 · पाठ 5 का 5पाठ्यक्रम में 20/50~10 min
मॉड्यूल पाठ (5/5)

सॉर्ट पैकेज के साथ सॉर्टिंग

मानक sort पैकेज स्थान में स्लाइस को क्रमबद्ध करता है। आधार प्रकार के लिए (int, फ्लोट64, स्ट्रिंग) प्रत्यक्ष सहायक हैं; किसी अन्य टुकड़े के लिए आप less(i, j int) bool फ़ंक्शन के साथ sort.Slice का उपयोग करें जो परिभाषित करता है आदेश देना

आधार प्रकारों के लिए सहायक

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, यदि तत्व i j से पहले आना चाहिए, तो true लौटाता है:

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

यदि तत्व वहां नहीं है, तो यह सम्मिलन सूचकांक लौटाता है। आप खोद सकते हैं जब आपको उनकी आवश्यकता हो तो विवरण में।

जेनेरिक (गो 1.21+): slices.Sort

stdlib में slices पैकेज से (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 का उपयोग करके उम्र के अनुसार लोगों को आरोही क्रम में क्रमबद्ध करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

जब तत्व i को j से पहले आना चाहिए तो कम फ़ंक्शन सत्य लौटाता है।

3 प्रयासों के बाद समाधान उपलब्ध है

Quiz#go.m4.l5.e3
तैयार

आप सॉर्ट.स्लाइस के साथ अवरोही क्रम में कैसे सॉर्ट करते हैं?

Go
sort.Slice(s, func(i, j int) bool { return ??? })
उत्तर विकल्प

संक्षिप्त

  • sort.Ints / sort.Strings / sort.Float64s आधार प्रकारों के लिए, यथास्थान।
  • less(i, j) फ़ंक्शन के साथ, किसी भी प्रकार के स्लाइस के लिए sort.Slice(s, less)।
  • sort.SliceStable समान कुंजियों के सापेक्ष क्रम को संरक्षित करने के लिए।
  • एकाधिक कुंजियों के आधार पर क्रमबद्ध करना: less के अंदर ifs का एक झरना।
  • 1.21+ पर जाएं: slices पैकेज एक सामान्य एपीआई के साथ (slices.Sort, slices.SortFunc)।
  • मानचित्र कुंजियों के लिए: एक स्लाइस में निकालें और क्रमबद्ध करें।