CS 지식을 공부하다보면 Sorting(정렬)과 관련된 주제는 정말 수도 없이 많이 다룬다.
그도 그럴 것이 정렬은 참 쓸 데가 많다. 당장 출석부 같은 것만 보아도 이름 순으로 정렬을 한 게 스테레오 타입이지 않는가.
아무튼 Sorting이 뭐냐고 묻는다면 다들 정렬 이라고 하겠지만, 조금 더 엄밀한 정의를 내려보자.
랜덤한 순서의 배열을 재배치하여 오름차순(내림차순)으로 만드는 것
이라고 할 수 있겠다.
일반적으로는 오름차순으로 나타내는 것이 맞다.
대충 알겠으니 바로 하나의 알고리즘으로 넘어가자.
Insertion Sort는 참 쉬운 알고리즘 중 하나이다.
원카드를 한다고 생각하고 앞에서부터 카드 정리를 한다고 생각하자.
그럼 아마 그 카드를 뽑고 적절한 위치에 넣는 방법을 선택하지 않을까 싶다.
물론 아닐 수도 있는데 그건 내 알빠는 아니다.
간단하게 로직 설명 한 번 해보자.
대충 느낌오죠?
슈도 코드는 쓰기 귀찮으니까 사진으로 대체 한다.

그냥 위에서 설명한거랑 똑같다.
알고리즘은 사실 그냥 짰다고 다가 아니긴하다.
이렇게 끝날 거 같으면 나도 윤강훈-Sort 하나 만들어서 내지 그냥
썩을 놈의 증명 한 번 해줘야한다.
대충 보면 잘 동작하는 거 아니냐고?
맞긴 한데 아닐 수도 있잖아.
백준 풀다가 98%에서 틀렸습니다! 나오면 진짜 화가 머리 끝까지 나는 상황을 한 번 경험해봤으면 증명이 얼마나 중요한 지 알 수 있을거다.

자 암튼 재귀를 활용한 증명과 반복을 활용한 증명이 있는데 이 친구는 반복을 한 번 활용해보자.
이유가 뭐냐고? 묻지도 마 그냥!! 진짜 프로 출신들은 슈도 코드만 봐도 뭘 써야하는 지 다 안다고

뻘소리는 그만하고 증명 한 번 하자.
일단 반복문으로 구성된 알고리즘의 경우 반복문이 진행되면서 변하지 않는 것을 찾는 것이 중요하다.
우리는 이걸 Loop Invariants (루프 불변성) 라고 부를 것이다.
위에서 말했던 Logic에서 힌트를 찾을 수 있다.
카드를 하나 뽑고 "앞에 있는 카드들과 비교"
이 말에서 프로 출신들은 바로 깨달았을 것이다.
내가 뽑은 것 앞에 있는 놈들은 다 정렬되어 있다.
절대 등수대로 서렌치면 안된다는 것이다.
지금 8등에서 반등 타이밍 잘 잡았는데 차례대로 죽여야지 1등부터 칠려고 하면 안된다.

점수판 제대로 등반해야겠지?
암튼 이걸 좀 더 정적으로 설명하자면
번째 iteration에서 이 정렬되어 있다는 사실은 불변이다.
이걸 증명하기 위해서도 3가지 단계가 필요하다.
초기 조건
일 때, 은 이므로 반드시 정렬되어 있다.
유지 조건
선택된 원소가 1칸씩 앞으로 가서 자리를 찾고 나면 또한 정렬되어 있다.
종료 조건
번째 iteration이 마지막 iteration이며, 이게 끝나고 나서 도 정렬되어 있다.
이렇게 3가지 단계를 모두 만족하는 것을 증명했다면 이 알고리즘은 정상 작동하는 것으로 잘 증명되었다.
쓰기에는 너무 많으니 사진 한 장으로 대체한다.

최선의 경우 일 것이며,
최악의 경우 시간이 걸릴 것이다.
그럼 평균적인 경우는 어떨까?
러프하게 j/2 번 반복한다고 했을 때, 이 또한 시간이 걸릴 것이다.
앞의 글에서 말했듯이 최선일 때를 고려할 필요는 없다.