Задать вопрос
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

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

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

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

Похожие вопросы