버블정렬이 느린 이유는 순회의 순회, 그러니까 N^2 이 알고리즘에 필연적으로 포함되어 있기때문!
그렇다면 알고리즘 자체를 바꾸지 않는 선에서
정렬 성능을 개선하기 위해서는 순회에 대한 제어가 필요하다는 말이 되겠다.
순회 개선을 하기 위해서는 일종의 숏컷 검사기들을 도입하면 되는데.
먼저 아래 코드를 보자. (Golang)
func minimumBribes(q []int32) {
totalSwapCnt := int32(0)
tmp := int32(0)
chaos:=false
swapInLoop:=false
offset:=0
backOffset:=0
for i:=len(q)-1;!chaos&&i>0;i--{
for j:=offset;j<i-backOffset;j++ {
if q[j] > int32(j)+3 {
chaos = true
break
}
if q[j] > q[j+1] {
if swapInLoop == false {
if j>1 && q[j-1]==int32(j) && offset < j-1 {
offset=j-1
}
swapInLoop=true
}
totalSwapCnt++
tmp = q[j+1]
q[j+1] = q[j]
q[j] = tmp
}
if j==i-1 && q[j]==int32(j+1) {
backOffset++
}
}
if swapInLoop == false {
break
}
}
if chaos {
fmt.Println("Too chaotic")
} else {
fmt.Println(totalSwapCnt)
}
}
위 코드에 적용된 버블정렬 숏컷의 종류는 총 3가지다.
(코드만 보고 다 찾고 이해했다면 뒤로가기를 눌러주세요)
** 값을 크기에 따라 있어야 할 위치번호를 아는경우에는 솔직히 버블정렬 할 필요 없지만 이동횟수 측정 등이 필요한 경우에 적용할 수 있음