don't stop believing

Comb Sort - 빗질 정렬 본문

Golang/Basic

Comb Sort - 빗질 정렬

Tongchun 2019. 4. 29. 17:13

버블 정렬과 비슷한 계념으로 비교 대상을 배열의 앞과 뒤에서부터 시작하며 그 간격을 좁혀가며 정렬하는 방법입니다.

https://en.wikipedia.org/wiki/Comb_sort

 

Comb sort - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Interval based sorting algorithm Comb sort is a relatively simple sorting algorithm originally designed by Włodzimierz Dobosiewicz in 1980.[1][2] Later it was rediscovered by Stephen L

en.wikipedia.org

Go로 구현한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import "fmt"
func main() {
arr := [10]int{9,1,2,8,6,7,5,3,0,4}
fmt.Println("Initial array is:", arr)
fmt.Println("")
arrLen := len(arr)
gap := arrLen
for gap > 1 {
gap = gap * 10 / 13 //shrink factor is 1.3
for i := 0; i+gap < arrLen; i++ {
if arr[i] <= arr[i+gap] {
arr[i], arr[i+gap] = arr[i+gap], arr[i]
}
}
}
fmt.Println("Sorted array is: ", arr)
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

각 코드에 대한 설명을 주석으로 달았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main
import (
"fmt"
)
func main() {
arr := [10]int{9, 1, 2, 8, 6, 7, 5, 3, 0, 4}
fmt.Println("Initial array is:", arr)
fmt.Println("")
// .
arrLen := len(arr)
// gap .
gap := arrLen
for gap > 1 {
// shrink factor .
// shrink factor int 10 7, 5, 3, 2, 1 .
gap = gap * 10 / 13
// i+gap for loop .
for i := 0; i+gap < arrLen; i++ {
// 0 릿 i gap .
if arr[i] >= arr[i+gap] {
// i 릿 .
arr[i], arr[i+gap] = arr[i+gap], arr[i]
}
}
}
fmt.Println("Sorted array is: ", arr)
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

다른 comb sort 예제들도 비슷하네요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
slice := generateSlice(20)
fmt.Println("\n--- Unsorted --- \n\n", slice)
combsort(slice)
fmt.Println("\n--- Sorted ---\n\n", slice)
}
// Generates a slice of size, size filled with random numbers
func generateSlice(size int) []int {
slice := make([]int, size, size)
rand.Seed(time.Now().UnixNano())
for i := 0; i < size; i++ {
slice[i] = rand.Intn(999) - rand.Intn(999)
}
return slice
}
func combsort(items []int) {
var (
n = len(items)
gap = len(items)
shrink = 1.3
swapped = true
)
for swapped {
swapped = false
gap = int(float64(gap) / shrink)
if gap < 1 {
gap = 1
}
for i := 0; i+gap < n; i++ {
if items[i] > items[i+gap] {
items[i+gap], items[i] = items[i], items[i+gap]
swapped = true
}
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

 

'Golang > Basic' 카테고리의 다른 글

Heap Sort - 힙 정렬  (0) 2019.05.07
Odd-Even Sort - 홀짝 정렬  (0) 2019.05.01
Quick Sort - 퀵 정렬  (0) 2019.04.28
Gnome Sort - 난쟁이 정렬  (0) 2019.04.25
Cocktail Sort - 칵테일 정렬  (0) 2019.04.22
Comments