shell sort

This commit is contained in:
Gregory 2021-12-14 14:01:44 +02:00
parent a90f8032bf
commit 6fe973096e
2 changed files with 47 additions and 0 deletions

37
sorting/shell.go Normal file
View file

@ -0,0 +1,37 @@
package sorting
type shell struct{}
func (*shell) Sort(items Sortable) {
len := items.Len()
gap := 1
// Calculating gap maximum value.
// This is for "Sedgewick gap sequence" variation.
// Another sequences can be used
for gap < len/3 {
gap = gap*3 + 1
}
// This loop needed to progressively degrease gap until siple insertion
// sort will be used
for gap >= 1 {
// Insertion sort loop
for i := gap; i < len; i++ {
// Instead of comparing adjacent elements we compare
// gap distance elements and swap them
for j := i; j >= gap && items.Less(j, j-gap); j -= gap {
items.Swap(j, j-gap)
}
}
// "Sedgewick gap sequence"
gap = gap / 3
}
}
func NewShell() Sorter {
return &shell{}
}

View file

@ -23,3 +23,13 @@ func BenchmarkInsertion(b *testing.B) {
BenchmarkSort(10000, NewInsertion())
}
}
func TestShell(t *testing.T) {
CheckSorter(NewShell())
}
func BenchmarkShell(b *testing.B) {
for i := 0; i < b.N; i++ {
BenchmarkSort(10000, NewShell())
}
}