Catofood
@Catofood

Создать новый массив для новых значений или изменить значения старого массива?

Здравствуйте.
В книге про алгоритмы (грокаем алгоритмы) есть пример создания функции сортировки массива (selection sort). В книге в теле функции сортировки используются две переменные и два массива (Один входящий не отсортированный и один выходящий отсортированный).

Я сделал функцию немного по-своему и отказался от создания нового массива, т.е. решил все операции замены производить просто с помощью переменных.

Мой код с одним массивом:
package main

import (
	"fmt"
	"time"
)

func pleaseSortMeNumbers(n []int) []int {
	counter := 0
	fmt.Println("Sorting algorithm started...")
	for i := range n {
		lowestNumber := n[i]
		lowestNumberId := i
		for j := i; j <= len(n)-1; j++ {
			if lowestNumber > n[j] {
				lowestNumber = n[j]
				lowestNumberId = j
			}
			counter++
		}
		n[lowestNumberId] = n[i]
		n[i] = lowestNumber

	}
	time.Sleep(time.Second / 2)
	fmt.Println("Sorting done!")
	time.Sleep(time.Second / 2)
	fmt.Println(counter, " comparisons.")
	time.Sleep(time.Second / 2)
	fmt.Println("Slice: ", n)
	return n
}


Пример кода из книги с двумя массивами:
60681005f1c55891078390.png

По идее, в моей реализации алгоритма в памяти занимается место под две переменные и под один массив, а в алгоритме из книги место в памяти занимается под две переменные и два массива. Мои рассуждения верны или нет? Мой алгоритм лучше или хуже?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 1
hugga
@hugga
Ваш код реализует сортировку in-place (на месте). Такой способ позволяет изменять данные во входящем массиве (на самом деле у вас в коде слайс) и не возвращать его из функции, а просто использовать его далее после вызова ф-ции сортировки.
В целом ваши рассуждения верны, т.к. выделение места под массив всегда дорогая операция. Но ваш способ сортировки применим не всегда. Иногда обязательно сохранить исходный массив в целости.

По самому коду не очень ясно зачем используется Sleep
Посоветую называть массивы\слайсы более осмысленно, например arr или src
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы