# Golang Shell Sort Algorithm

The shell sort algorithm sorts a pair of elements that are not in sequence in a collection. The distance between the elements to be compared is decreased sequentially. This algorithm performs more operations and has a greater cache miss ratio than the quick sort algorithm.

# Golang Shell Sort Algorithm Implementation

In the following code, we can see the implementation of the shell sort algorithm. The ShellSorter function takes an integer array as a parameter and sorts it:

``````
package main

// importing fmt and bytes package
import (
"fmt"
)

// shell sorter method
func ShellSorter(elements []int) {
var (
n         = len(elements)
intervals = []int{1}
k         = 1
)

for {
var interval int
interval = power(2, k) + 1
if interval > n-1 {
break
}
intervals = append([]int{interval}, intervals...)
k++
}
var interval int
for _, interval = range intervals {
var i int
for i = interval; i < n; i += interval {
var j int
j = i
for j > 0 {
if elements[j-interval] > elements[j] {
elements[j-interval], elements[j] = elements[j], elements[j-interval]
}
j = j - interval
}
}
}
}

//power function
func power(exponent int, index int) int {
var power int
power = 1
for index > 0 {
if index&1 != 0 {
power *= exponent
}
index >>= 1
exponent *= exponent
}
return power
}

// main method
func main() {
var elements []int
elements = []int{34, 202, 13, 19, 6, 5, 1, 43, 506, 12, 20, 28, 17, 100, 25, 4, 5, 97, 1000, 27}
fmt.Println("\n^^^^^^ Before Sorting ^^^ \n\n", elements)
ShellSorter(elements)
fmt.Println(elements)
fmt.Println("\n--- After Sorting ---\n\n", elements)
}
```
```

Output:

```
^^^^^^ Before Sorting ^^^

[34 202 13 19 6 5 1 43 506 12 20 28 17 100 25 4 5 97 1000 27]
[1 4 5 5 6 12 13 17 19 20 25 27 28 34 43 97 100 202 506 1000]

--- After Sorting ---

[1 4 5 5 6 12 13 17 19 20 25 27 28 34 43 97 100 202 506 1000]
```