Skip to content

sort

TIP

หากคุณเป็นนักพัฒนาเวอร์ชัน 1.21 ขึ้นไป ฉันแนะนำให้ใช้ไลบรารีมาตรฐาน slices สำหรับการเรียงลำดับ มันรองรับ generics และมีการออกแบบ API ที่สมเหตุสมผลกว่า

ในแพ็กเกจ sort ของ Go จัดเตรียมวิธีการเรียงลำดับที่ใช้งานโดย官方 ส่วนใหญ่สามารถใช้งานได้ทันที หากต้องการเรียงลำดับ struct ต้องใช้งานสามวิธีการภายใต้ sort.Interface คือ Len() swap() Less() เนื่องจาก官方ได้ใช้งานสามประเภท Float64Slice StringSlice IntSlice ไว้แล้ว ดังนั้นสามประเภทนี้ไม่ต้องใช้งานเองสามารถใช้ได้โดยตรง

go
type Interface interface {
   // วิธีการความยาว
   Len() int

   // วิธีการเปรียบเทียบ
   Less(i, j int) bool

   // วิธีการสลับ
   Swap(i, j int)
}

การเรียงลำดับจำนวนเต็ม

go
func main() {
   ints := []int{1, 2, 3, 111, 5, 99, 23, 5, 66}
   sort.Ints(ints)
}

การเรียงลำดับจุดลอยตัว

go
func main() {
   floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
   sort.Float64s(floats)
   fmt.Println(floats)
}

การเรียงลำดับสตริง

go
func main() {
   strings := []string{"helloworld", "aaa", "bbb", "ccc"}
   sort.Strings(strings)
}

การเรียงลำดับแบบย้อนกลับ

ต้องห่อด้วย sort.Reverse ก่อนแล้วจึงเรียงลำดับ

go
func main() {
  floats := []float64{1.0, 2.5, 3.8, 1.11, 5.5, 99.99999, 23.9999, 5.66, 66}
  sort.Sort(sort.Reverse(sort.Float64Slice(floats)))
  fmt.Println(floats)
}

การเรียงลำดับแบบกำหนดเอง

หากต้องการเรียงลำดับ struct แบบกำหนดเอง ต้องใช้งานสามวิธีการ

go
type Person struct {
  UserId   string
  Username string
  Age      int
  Address  string
}

type PersonSlice []Person

// ส่งคืนความยาวของสไลซ์
func (p PersonSlice) Len() int {
  return len(p)
}

// วิธีการเปรียบเทียบ
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// วิธีการสลับ
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

เนื่องจากเปรียบเทียบตามอายุ ผลลัพธ์จึงเรียงลำดับตามขนาดของอายุ

go
func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   fmt.Println(persons)
}

เรียงลำดับหรือไม่

ตรวจสอบว่าสไลซ์เรียงลำดับหรือไม่ ภายในจะไม่ดำเนินการเรียงลำดับ แต่ใช้การเรียก Less() แบบวนซ้ำเพื่อตรวจสอบ

go
func main() {
   persons := []Person{{
      UserId:   "1",
      Username: "wyh",
      Age:      18,
      Address:  "us",
   }, {
      UserId:   "2",
      Username: "jack",
      Age:      17,
      Address:  "ch",
   }, {
      UserId:   "3",
      Username: "mike",
      Age:      15,
      Address:  "india",
   }}

   sort.Sort(PersonSlice(persons))

   println(sort.IsSorted(PersonSlice(persons)))
}

Golang by www.golangdev.cn edit