cpp

Сортировка слайса

Сортировка слайса — это упорядочивание элементов по возрастанию или убыванию значений. Сортировка применяется при выводе значений, а также при подготовке слайса к частому поиску значений. Поиск по отсортированному слайсу производится гораздо быстрее, так как не нужно каждый раз просматривать все значения слайса.

Для упорядочивания элементов слайса в учебных целях очень часто применяется метод, называемый пузырьковой сортировкой (листинг 5.2). При этом методе наименьшее значение как бы «всплывает» в начало слайса, а наибольшее значение «погружается» в конец слайса. Сортировка выполняется в несколько проходов. При каждом проходе последовательно сравниваются значения двух элементов, которые расположены рядом. Если значение первого элемента больше второго, то значения элементов меняются местами. Для сортировки слайса из пяти элементов необходимо максимум четыре прохода и десять сравнений. Если после прохода не было ни одной перестановки, то сортировку можно прервать. В этом случае для сортировки ранее уже отсортированного слайса нужен всего один проход.

Листинг 5.2. Пузырьковая сортировка по возрастанию

package main

import "fmt"

func main() {
   arr := []int{10, 5, 6, 1, 3}
   Sort(arr)
   fmt.Println(arr)
}
func Sort(arr []int) {
   if len(arr) < 2 {
      return
   }
   k := len(arr) - 2
   isSwap := false
   for i := 0; i <= k; i++ {
      isSwap = false
      for j := k; j >= i; j-- {
         if arr[j] > arr[j + 1] {
            arr[j], arr[j + 1] = arr[j + 1], arr[j]
            isSwap = true
         }
      }
      // Если перестановок не было, то выходим
      if !isSwap {
         break
      }
   }
}

В качестве еще одного примера произведем сортировку по убыванию (листинг 5.3). Чтобы пример был более полезным изменим направление проходов.

Листинг 5.3. Пузырьковая сортировка по убыванию

package main

import "fmt"

func main() {
   arr := []int{5, 6, 1, 10, 3}
   SortReverse(arr)
   fmt.Println(arr)
}
func SortReverse(arr []int) {
   if len(arr) < 2 {
      return
   }
   isSwap := false
   for i := len(arr) - 1; i >= 1; i-- {
      isSwap = false
      for j := 0; j < i; j++ {
         if arr[j] < arr[j + 1] {
            arr[j], arr[j + 1] = arr[j + 1], arr[j]
            isSwap = true
         }
      }
      // Если перестановок не было, то выходим
      if !isSwap {
         break
      }
   }
}

Для сортировки слайса можно воспользоваться следующими стандартными функциями из пакета sort:

  • Ints() — сортирует слайс, состоящий из элементов типа int, по возрастанию. Формат функции:
sort.Ints(x []int)

Пример:

arr := []int{5, 6, 1, 10, 3}
sort.Ints(arr)
fmt.Println(arr) // [1 3 5 6 10]

Для сортировки слайса по убыванию можно воспользоваться следующим кодом:

arr := []int{5, 6, 1, 10, 3}
sort.Sort(sort.Reverse(sort.IntSlice(arr)))
fmt.Println(arr) // [10 6 5 3 1]
  • IntsAreSorted() — возвращает значение true, если слайс отсортирован по возрастанию, и false — в противном случае. Формат функции:
sort.IntsAreSorted(x []int) bool

Пример:

arr := []int{5, 6, 1, 10, 3}
fmt.Println(sort.IntsAreSorted(arr)) // false
arr = []int{1, 3, 5, 6, 10}
fmt.Println(sort.IntsAreSorted(arr)) // true
  • Float64s() — сортирует слайс, состоящий из элементов типа float64, по возрастанию. Формат функции:
sort.Float64s(x []float64)

Пример:

arr := []float64{5.5, 6.3, 1.4, 10.5, 3.3}
sort.Float64s(arr)
fmt.Println(arr) // [1.4 3.3 5.5 6.3 10.5]

Для сортировки слайса по убыванию можно воспользоваться следующим кодом:

arr := []float64{5.5, 6.3, 1.4, 10.5, 3.3}
sort.Sort(sort.Reverse(sort.Float64Slice(arr)))
fmt.Println(arr) // [10.5 6.3 5.5 3.3 1.4]
  • Float64sAreSorted() — возвращает значение true, если слайс отсортирован по возрастанию, и false — в противном случае. Формат функции:
sort.Float64sAreSorted(x []float64) bool

Пример:

arr := []float64{5.5, 6.3, 1.4, 10.5, 3.3}
fmt.Println(sort.Float64sAreSorted(arr)) // false
arr = []float64{1.4, 3.3, 5.5, 6.3, 10.5}
fmt.Println(sort.Float64sAreSorted(arr)) // true
  • Strings() — сортирует слайс, состоящий из элементов типа string, по возрастанию. Формат функции:
sort.Strings(x []string)

Пример:

arr := []string{"d", "a", "c", "b"}
sort.Strings(arr)
fmt.Println(arr) // [a b c d]

Для сортировки слайса по убыванию можно воспользоваться следующим кодом:

arr := []string{"d", "a", "c", "b"}
sort.Sort(sort.Reverse(sort.StringSlice(arr)))
fmt.Println(arr) // [d c b a]
  • StringsAreSorted() — возвращает значение true, если слайс отсортирован по возрастанию, и false — в противном случае. Формат функции:
sort.StringsAreSorted(x []string) bool

Пример:

arr := []string{"d", "a", "c", "b"}
fmt.Println(sort.StringsAreSorted(arr)) // false
arr = []string{"a", "b", "c", "d"}
fmt.Println(sort.StringsAreSorted(arr)) // true
  • Sort() — сортирует произвольный слайс по возрастанию. Тип слайса должен реализовывать интерфейс Interface. Формат функции:
sort.Sort(data sort.Interface)

Пример:

arr := []int{5, 6, 1, 10, 3}
sort.Sort(sort.IntSlice(arr))
fmt.Println(arr) // [1 3 5 6 10]
  • Stable() — сортирует произвольный слайс по возрастанию, сохраняя исходный порядок равных элементов. Тип слайса должен реализовывать интерфейс Interface. Формат функции:
sort.Stable(data sort.Interface)

Пример:

arr := []int{5, 6, 1, 10, 3, 3}
sort.Stable(sort.IntSlice(arr))
fmt.Println(arr) // [1 3 3 5 6 10]
  • IsSorted() — возвращает значение true, если слайс отсортирован по возрастанию, и false — в противном случае. Тип слайса должен реализовывать интерфейс Interface. Формат функции:
sort.IsSorted(data sort.Interface) bool

Пример:

arr := []int{5, 6, 1, 10, 3}
fmt.Println(sort.IsSorted(sort.IntSlice(arr))) // false
arr = []int{1, 3, 5, 6, 10}
fmt.Println(sort.IsSorted(sort.IntSlice(arr))) // true
  • Slice() — сортирует произвольный слайс. Формат функции:
sort.Slice(x interface{}, less func(i int, j int) bool)

Пример:

arr := []int{5, 6, 1, 10, 3}
// Сортировка по возрастанию
sort.Slice(arr, func(i, j int) bool { return arr[i] < arr[j] })
fmt.Println(arr) // [1 3 5 6 10]
// Сортировка по убыванию
arr = []int{5, 6, 1, 10, 3}
sort.Slice(arr, func(i, j int) bool { return arr[i] > arr[j] })
fmt.Println(arr) // [10 6 5 3 1]
  • SliceStable() — сортирует произвольный слайс, сохраняя исходный порядок равных элементов. Формат функции:
sort.SliceStable(x interface{}, less func(i int, j int) bool)

Пример:

arr := []int{5, 6, 1, 10, 3}
sort.SliceStable(arr, func(i, j int) bool {
   return arr[i] < arr[j]
})
fmt.Println(arr) // [1 3 5 6 10]
  • SliceIsSorted() — возвращает значение true, если слайс отсортирован, и false — в противном случае. Формат функции:
sort.SliceIsSorted(x interface{},
                   less func(i int, j int) bool) bool

Пример:

arr := []int{5, 6, 1, 10, 3}
fmt.Println(sort.SliceIsSorted(arr, func(i, j int) bool {
   return arr[i] < arr[j]
})) // false
arr = []int{1, 3, 5, 6, 10}
fmt.Println(sort.SliceIsSorted(arr, func(i, j int) bool {
   return arr[i] < arr[j]
})) // true

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp