Uploaded by 산딸기

정렬 비교

advertisement
1. 버블, 선택, 삽입, 합병 정렬에서 입력크기에 따른 시간 차이
입력 크기의 따른 정렬 별 시간차
(1) 버블 정렬
우선 버블 정렬의 그래프는 그냥 봐도 너무 안 좋아 보인다. 왜 가장 안 좋은
지 생각해 보면 일단 일일이 하나하나 비교해 가야 한다. 가장 왼쪽 인덱스부터
하나씩 비교하고 자리 바꾸기를 반복해야 하고 이 과정에서 불필요한 교환이 너
무 많이 일어난다. 사실상 한 번의 패스당 가장 큰 수 하나의 자리만 찾아주기
때문에 원래 알맞은 자리에 있는 값이라 할지라도 수많은 교환으로 자리가 뒤바
뀌는 경우가 비일비재하다. 즉 한마디로 비교 횟수도 많은데 교환 횟수도 많다.그
나마 버블 정렬에 좋은 점이라 한다면 구현이 단순하기에 성능 차이가 별로 나지
않는 소규모의 경우를 정렬할 때 사용될 수 있다.
(2) 선택 정렬
그 다음 선택 정렬은 버블 정렬보다는 양호하다. 선택 정렬은 배열을 한번 쭉
살피고 최솟값을 찾아 맨 왼쪽 인덱스의 위치시키는데 버블 정렬과 마찬가지로
인덱스를 하나하나 정렬하기는 하지만 입력 개수가 커질수록 버블 정렬과 큰 차
이가 나는 이유는 버블 정렬과 달리 불필요한 인덱스 간의 위치 교환이 존재하지
않는다. 선택 정렬은 그냥 비교만 쭉 하고 비교가 끝난 후 위치를 변경하기에 버
블 정렬처럼 계속 위치를 교환하는 데에 시간을 사용하지 않아도 된다. 좋은 점
이라 한다면 구현이 간편하고 교환을 많이 안 한다.
(3) 삽입 정렬
삽입 정렬은 선택 정렬과 크게 차이가 나지는 않지만 그래도 더 적은 시간이
걸리는 이유는 바로 정렬된 부분을 맞이하였을 때라고 생각이 든다. 쉽게 말하면
선택 정렬은 정렬된 부분을 만났을 때 버블 정렬처럼 섞어버리지는 않지만 기억
하지는 못한다. 즉 최솟값을 찾기 위해 여러 번 돌 때 이미 정렬돼 있는 부분을
계속 마주치며 가는 것이다. 반면 삽입 정렬은 정렬된 부분을 이용한다. 굳이 버
블 정렬이나 선택 정렬과 같이 계속 처음부터 끝까지 비교하는 것을 반복하는 것
이 아닌 처음부터 비교하다가 정렬 안된 부분을 맞이하면 정렬을 하고 지나가 때
문에 정렬해둔 부분을 다시 볼 필요가 없다. 이 같은 성질 때문에 삽입 정렬이
선택 정렬이나 버블 정렬보다는 속도가 나오는 정렬인 것 같다. 하지만 삽입 정
렬은 완전히 거꾸로 되어있는 정렬을 만났을 때 속도가 현저히 느려지게 되는데
이에 대해선 조금 뒤에 나올 그래프를 보고 설명하겠다. 조금만 이야기하자면 비
교를 앞뒤로 계속하게 된다.
(4) 합병 정렬
마지막으로 합병 정렬이다. 합병 정렬은 한눈에 봐도 엄청난 성능을 확인할 수
있다. 물론 미세하게 입력 개수에 따라 시간이 증가하지만 그래프에서는 거의 티
가 나지 않는다. 합병 정렬이 이 같은 속도를 가질 수 있는 이유는 바로 분할을
이용하기 때문이다. 합병 정렬은 분할할 때 입력된 크기 n을 계속 절반씩 나누다
가 1이 될 때 중단하고 각 층의 총 비교합도 n번이다. 즉 아무리 입력이 커져도
비교 수는 입력 값의 크기만큼만 늘어나고 층도 일정한 비율로 늘어나기에 입력
이 커진다 해도 갑자기 성능이 떨어지지 않는다. 또한 병렬 형식으로 분할 시 동
시에 진행할 수 있다. 하지만 아무래도 합병 시 새로운 배열 C가 필요하기 때문
에 메모리에 있어서는 치명적이다.
(5) 정리
정리하자면 입력 개수가 적을 때는 4개의 정렬이 모두 비슷비슷한 성능을 가지고
있기에 유일하게 새로운 메모리를 할당하는 합병 정렬의 필요성에 대한 의문이
들 수 있지만 입력개수가 점점 늘어나면 그 차이가 확연히 나타나기에 메모리가
부족하지 않다면 특히 대용량인 데이터면 더더욱 합병 정렬을 사용해야한다고 생
각한다.
2. 삽입 정렬에서 입력된 배열에 순서에 따른 시간 차이
입력 순서의 따른 삽입 정렬의 시간차
(1) 역순으로 되어있을 경우
그래프를 보면 알다시피 역순으로 되어있을 경우에 속도가 가장 최악인데 그
이유는 삽입 정렬의 작동원리를 살펴보면 금방 알 수 있다. 삽입 정렬은 위와 같
은 순서로 정렬되는데 우선적으로 가장 왼쪽 인덱스를 정렬되었다 가정하고 정렬
이 안 되어있을 경우까지 쭉 비교한다. 하지만 역순이기 때문에 한 칸 옮길 때마
다 정렬이 안 되어 있어 위치를 바꿀 것이고 위치를 바꾸는 경우에도 앞 부분과
또 정렬이 맞는지를 확인하는데 역순일 경우에는 앞 부분도 삽입되는 애들과 정
렬이 안 맞기에 삽입되는 인덱스마다 맨 왼쪽 인덱스까지 가야 한다. 때문에 앞
부분에서도 비교하고 뒷부분에서도 비교하여 비교가 엄청 많아지게 된다. 삽입
정렬의 장점은 역시 정렬을 맞이하였을 경우다.
(2) 순서대로 되어있을 경우
삽입 정렬은 맨 왼쪽 인덱스를 정렬되어 있는 상태라 가정하고 한 칸씩 인덱스
를 비교해 나가다 정렬이 되어있지 않은 부분에서 멈추게 되는데 완전히 정렬이
되어있으면 멈출 일이 존재하지 않으므로 아무리 개수가 많아진다 해도 크게 영
향이 없다.
* 부분 정렬로 되어있을 경우는 1.에서 다루었으므로 따로 다루지는 않겠다.
3. 합병 정렬에서 입력된 배열에 순서에 따른 시간 차이
입력 순서의 따른 합병 정렬의 시간차
(1) 역순으로 되어있을 경우 + 순서대로 되어있을 경우
합병 정렬은 입력된 배열의 순서가 영향을 거의 미치지 않기에 두 경우를 같이
묶어서 이야기하겠다. 왜 영향을 미치지 않는가 하면 쉽게 말해 배열의 순서와
상관없이 합병 시 비교 횟수가 어차피 동일하다. 왜 이게 가능한가 하면 합병 정
렬은 분할할 시 각 층에 있는 합병되는 값끼리 하나하나 비교해가며 합병시키기
때문에 아무리 순서가 올바르고 역순이라 하더라도 어차피 입력된 값의 개수만큼
은 무조건 비교하기 때문에 순서가 상관이 없다는 것을 알 수 있다. 역시 합병
정렬이다...
(2) 부분 정렬 되어있는 경우와 역순 + 순서일 경우의 비교 위 내용에서 비교
횟수는 같다고 하였는데 왜 부분 정렬일 경우와 차이가 나는가 하면 부분 정렬은
합병되는 값 중 한쪽 부분이 전부 먼저 사용되는 경우가 역순, 순서대로의 경우
보다 적기 때문이다. 이게 무슨 말인가 하면 우리는 병합할 때 양 배열을 확인해
새로운 배열에 집어넣는데 비교 중 한쪽 배열이 전부 새로운 배열에 들어가게 되
면 남은 한 배열에 남은 값들은 그냥 전부 넣어주기 때문에 여기서 약간에 차이
가 발생하게 되는 것이다.
Download