Сортировка среза целых чисел - PullRequest
0 голосов
/ 28 апреля 2020

Мое намерение состоит в сортировке значений, указанных в срезе целых чисел. Я не хочу использовать пакет сортировки и хочу реализовать функцию сортировки. Проблема в том, когда я пытаюсь использовать индекс для сравнения элементов среза, которые я получаю из-за ошибки. Как правильно изменить срез?

func sortSlice( sli []int ) {
   j := 0
   i := 1
   for range sli {

        if( sli[j] > sli[j+1] ) {
            var  temp int  = sli[j];
            sli[i] = sli[j]
            sli[j] = temp
        }
        j++
    }
}

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Вы range больше sli означает, что вы повторяете len(sli) раз, поэтому j переходит от 0 к len(sli)-1. Теперь вы сравниваете элемент j с элементом j+1. Для последней итерации это означает, что вы сравниваете элемент len(sli)-1 с элементом len(sli). Этот последний индекс является проблемой. Элемент len(sli) отсутствует, поскольку индексы sli go с 0 до len(sli)-1.

Также обратите внимание, что в Go можно сказать sli[i], sli[j] = sli[j], sli[i], чтобы поменять местами два элемента. Тем не менее, ваш код не может работать, поскольку нигде не определено i.

Следующим в списке проблем является то, что это не весь пузырьковый алгоритм, который, я думаю, вы используете. Вы перебираете фрагмент только один раз, но это не приведет к его сортировке. Вам придется повторять l oop, пока у вас не будет перестановок.

2 голосов
/ 28 апреля 2020

Если я правильно понимаю, вы хотите сделать свою собственную реализацию, но не уверены, почему не хотите использовать пакет sort. Вы можете выполнить пользовательскую сортировку, переопределив go#interface.

Например,

Вы можете написать пользовательскую сортировку в go и вызвать ее с помощью пакета сортировки. в основном вы можете переопределить функцию сортировки для интерфейса и можете изменить поведение в соответствии с вашими потребностями. вы можете создать структуру, которая будет принимать ваши данные, как показано ниже, и переопределять функции Len (), Swap (), Less ()

type Sortslice struct {
    Sli []int
}

func (s Sortslice) Len() int {
    return len(s.Sli)
}

func (s Sortslice) Swap(i, j int) {
    s.Sli[i], s.Sli[j] = s.Sli[j], s.Sli[i]
}

func (s Sortslice) Less(i, j int) bool {
    if s.Sli[i] > s.Sli[j] {
        return true
    } else {
        return false
    }
}

После создания структуры вы можете передавать в нее свои данные и вызовите метод сортировки через интерфейс [], используя функцию sort.sort (). при этом для сортировки среза будет использоваться ваша логика c.

var data = []int{5,6,8,1,9,10}
sortedSlice := Sortslice{data}   
sort.Sort(sortedSlice);

Лучше использовать sort.Sort, так как это требует того, что делать (использовать сортировку слиянием, быструю сортировку).

Но если вы хотите сделать все самостоятельно, следуйте исходному коду sort.sort () и аналогичным образом напишите свои собственные вещи

source: https://yourbasic.org/golang/how-to-sort-in-go/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...