안정 정렬
같은 요소의 순서 유지하기
안정 정렬은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
안정 정렬이란
안정 정렬은 같은 요소를 원래의 상대적 순서대로 유지합니다. 두 레코드가 동일하게 비교되면 먼저 있던 레코드가 계속 먼저 옵니다.
중요한 이유
한 필드로 정렬하면서 동률일 때 이전 순서를 유지하려면 안정성이 중요합니다. 예를 들어 도시순으로 정렬하면서 각 도시 안에서는 사람을 이름순으로 유지할 수 있습니다.
sort.Slice는 안정적이지 않습니다
일반적인 sort.Slice는 안정성을 보장하지 않습니다. 같은 요소의 순서가 바뀔 수 있습니다. 안정성을 보장하려면 sort.SliceStable을 사용하십시오.
sort.SliceStable
sort.SliceStable은 sort.Slice와 같은 형식을 사용하지만 같은 요소의 순서를 유지합니다.
package main
import (
"fmt"
"sort"
)
func main() {
nums := []int{3, 1, 2, 1}
sort.SliceStable(nums, func(i, j int) bool {
return nums[i] < nums[j]
})
fmt.Println(nums)
}구조체로 안정성 확인하기
사람을 나이순으로 정렬하십시오. 안정 정렬을 사용하면 나이가 같은 사람은 입력 순서를 유지합니다.
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func main() {
p := []Person{{"Ann", 30}, {"Bob", 25}, {"Cara", 30}}
sort.SliceStable(p, func(i, j int) bool {
return p[i].Age < p[j].Age
})
fmt.Println(p)
}Ann이 Cara보다 먼저
앞선 예에서 Ann과 Cara는 모두 나이가 30입니다. 입력에서 Ann이 먼저 나왔으므로 안정 정렬을 사용하면 결과에서도 Ann이 Cara보다 먼저 옵니다.
여러 단계로 정렬하기
안정성을 활용하면 여러 단계로 정렬할 수 있습니다. 가장 덜 중요한 키로 먼저 정렬한 다음 가장 중요한 키로 정렬하십시오. 각 안정 정렬 단계는 동률일 때 이전 순서를 유지합니다.
package main
import (
"fmt"
"sort"
)
type Rec struct {
City string
Name string
}
func main() {
r := []Rec{{"Rome", "Zoe"}, {"Oslo", "Ann"}, {"Rome", "Ann"}}
sort.SliceStable(r, func(i, j int) bool { return r[i].Name < r[j].Name })
sort.SliceStable(r, func(i, j int) bool { return r[i].City < r[j].City })
fmt.Println(r)
}sort.Stable
sort.Interface를 구현하는 타입에는 안정성을 얻기 위해 sort.Sort 대신 sort.Stable을 사용하십시오.
package main
import (
"fmt"
"sort"
)
type ByLen []string
func (s ByLen) Len() int { return len(s) }
func (s ByLen) Less(i, j int) bool { return len(s[i]) < len(s[j]) }
func (s ByLen) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func main() {
w := []string{"bb", "cc", "a"}
sort.Stable(ByLen(w))
fmt.Println(w)
}안정성의 비용
안정 정렬은 불안정 정렬보다 메모리나 시간이 약간 더 들 수 있습니다. 같은 요소의 순서를 유지할 필요가 없다면 일반적인 sort.Slice를 사용해도 됩니다.
안정 정렬을 선택할 때
다음과 같은 경우에는 안정 정렬을 선택하십시오:
- 원소에 의미 있는 원래 순서가 있을 때
- 서로 다른 키를 기준으로 여러 번 정렬할 때
- 같은 원소들의 순서가 바뀌면 안 될 때
안정 정렬 확인 예시
정렬 키가 같은 두 원소가 입력 순서대로 A, B의 순서로 나타납니다. 안정 정렬은 출력에서도 A가 B보다 앞에 있도록 보장합니다.
package main
import (
"fmt"
"sort"
)
func main() {
type T struct{ Key, Tag int }
ts := []T{{1, 100}, {1, 200}, {0, 300}}
sort.SliceStable(ts, func(i, j int) bool { return ts[i].Key < ts[j].Key })
fmt.Println(ts)
}빠른 확인
sort.SliceStable을 사용하여 도시를 기준으로 레코드를 정렬합니다. 두 레코드의 도시가 같습니다. 무엇이 보장됩니까?
복습
안정 정렬은 같은 원소들의 순서를 보존합니다:
- 슬라이스에는
sort.SliceStable사용 - sort.Interface 형식에는
sort.Stable사용 - 서로 다른 키를 기준으로 여러 번 정렬 가능
자주 묻는 질문
“안정 정렬” 강의는 무료인가요?
네 — “안정 정렬” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“안정 정렬”에서 뭘 배우나요?
같은 요소의 순서 유지하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“안정 정렬” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.