0Pricing
Go Academy · 강의

안정 정렬

같은 요소의 순서 유지하기

안정 정렬은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 슬라이스 정렬하기
  2. 사용자 지정 정렬 순서
  3. 정렬된 데이터 검색하기
  4. 안정 정렬
← Go Academy(으)로 돌아가기