Go - 삽입정렬 구현하기
728x90
시간 복잡도
- 최악의 경우(역으로 정렬 된 경우)
- 비교 횟수 : 외부 루프 안의 각 반복마다 i번의 비교 수행
- (n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2 = O(n^2)
- 최선의 경우
- 비교 횟수 : 이동 없이 1번의 비교만 이루어진다.
- (n-1)번 = O(n)
공간 복잡도
기존에 주어진 배열에서 원소 Swap만 이루어지므로 공간 복잡도는 O(n)이다.
특징
장점
- 알고리즘 구현이 비교적 단순하다.
- 대부분의 원소가 이미 정렬되어 있는 경우에 효율적이다.
- 주어진 배열에서만 교환하므로 다른 메모리 공간이 필요하지 않다. => 제자리 정렬(in-place sorting)
- 안정 정렬이다.
- 다른 O(n^2) 알고리즘에 비해 상대적으로 빠르다.
단점
- 시간 복잡도가 평균, 최악에서는 O(n^2)로 굉장히 비효율적이다.
Code
package main
import (
"bufio"
"fmt"
"os"
)
func insertionSorting(arr []int) []int {
for i := 1; i < len(arr); i++ {
tmp := arr[i]
idx := i - 1
for 0 <= idx && tmp < arr[idx] {
arr[idx+1] = arr[idx]
idx--
}
arr[idx+1] = tmp
}
return arr
}
func main() {
rd := bufio.NewReader(os.Stdin)
wr := bufio.NewWriter(os.Stdout)
var n int
fmt.Fscanf(rd, "%d\n", &n)
arr := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscanf(rd, "%d\n", &arr[i])
}
sorted := insertionSorting(arr)
for _, ele := range sorted {
fmt.Fprintf(wr, "%d\n", ele)
}
wr.Flush()
}
728x90
'Go' 카테고리의 다른 글
Go interface: 대소문자 의 의미 (0) | 2021.10.20 |
---|---|
Docker 로 Go 프로젝트 빌드 & 실행하기 (0) | 2021.10.05 |
Go - 구조화된 로그 남기기 (0) | 2021.09.24 |
Golang 으로 맛보는 TDD(테스트 주도 개발) (0) | 2021.09.15 |
Go lang 에서 Mysql 연동하기 (0) | 2021.09.10 |
댓글
이 글 공유하기
다른 글
-
Go interface: 대소문자 의 의미
Go interface: 대소문자 의 의미
2021.10.20 -
Docker 로 Go 프로젝트 빌드 & 실행하기
Docker 로 Go 프로젝트 빌드 & 실행하기
2021.10.05 -
Go - 구조화된 로그 남기기
Go - 구조화된 로그 남기기
2021.09.24 -
Golang 으로 맛보는 TDD(테스트 주도 개발)
Golang 으로 맛보는 TDD(테스트 주도 개발)
2021.09.15