Skip to content

sort

TIP

Nếu bạn là nhà phát triển phiên bản 1.21 trở lên, tôi khuyên dùng thư viện chuẩn slices để sắp xếp, nó hỗ trợ generics, thiết kế API hợp lý hơn.

Gói sort trong Go cung cấp các phương thức sắp xếp do chính thức triển khai, hầu hết có thể sử dụng ngay. Nếu muốn sắp xếp struct thì phải thực hiện ba phương thức Len() swap() Less() trong sort.Interface. Vì chính thức đã triển khai sẵn ba kiểu Float64Slice StringSlice IntSlice, nên ba kiểu này có thể sử dụng trực tiếp mà không cần tự triển khai.

go
type Interface interface {
   // Phương thức độ dài
   Len() int

   // Phương thức so sánh
   Less(i, j int) bool

   // Phương thức hoán đổi
   Swap(i, j int)
}

Sắp xếp số nguyên

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

Sắp xếp số dấu phẩy động

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)
}

Sắp xếp chuỗi

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

Sắp xếp ngược

Cần đóng gói bằng sort.Reverse trước khi sắp xếp

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)
}

Sắp xếp tùy chỉnh

Nếu muốn sắp xếp struct tùy chỉnh thì phải thực hiện ba phương thức.

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

type PersonSlice []Person

// Trả về độ dài slice
func (p PersonSlice) Len() int {
  return len(p)
}

// Phương thức so sánh
func (p PersonSlice) Less(i, j int) bool {
  return p[i].Age < p[j].Age
}

// Phương thức hoán đổi
func (p PersonSlice) Swap(i, j int) {
  p[i], p[j] = p[j], p[i]
}

Vì so sánh dựa trên tuổi, nên kết quả được sắp xếp theo độ lớn của tuổ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)
}

Có được sắp xếp không

Kiểm tra một slice có được sắp xếp không, bên trong không thực hiện thao tác sắp xếp mà thông qua việc gọi vòng lặp Less() để kiểm tra

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