CS 기초/알고리즘

[CS50] 정렬 알고리즘의 실행시간

담크 2021. 8. 15. 20:39

지금까지 정렬 알고리즘이나 검색 알고리즘을 공부하면서 실행 시간의 상한과 하한도 함께 배워봤습니다. 오늘은 각각의 실행시간을 비교해보면서 그 시간을 단축시킬 수 있는 방법이 있는지에 대해 공부해보도록 하겠습니다.

 

지금까지 선형 검색(탐색), 이진 검색(탐색), 버블 정렬, 선택 정렬의 실행시간을 Big-O와 Big-Ω로 나눠보면

 

- 실행시간의 상한

O(n^2) : 선택 정렬, 버블 정렬

O(n log n)

O(n) : 선형 검색

O(log n) : 이진 검색

O(1)

- 실행시간의 하한

Ω(n^2) : 선택 정렬, 버블 정렬

Ω(n log n)

Ω(n)

Ω(log n)

Ω(1) : 선형 검색, 이진 검색

로 나눠볼 수 있습니다.

 

그런데 여기서 실행시간을 단축시킬수 있는 게 있을까요?? 생각해봅시다.

 

버블 정렬의 경우 지난 포스팅에서 정리했듯이 의사 코드로 표현하자면

repeat n-1 times 
	for i from 0 to n-2 
	if i`th and i+1`th elements out of order 
		Swap them

이렇게 표현할 수 있었습니다. 앞뒤 숫자를 비교해서 더 큰 수는 뒤로 가게끔 만들어줬죠

그런데 만약에 정렬이 완료된 숫자 리스트가 주어진다면 어떨까요??

그렇게되면 바깥쪽 루프를 조금 수정해야 합니다.

repeat until no swap 
	for i from 0 to n-2 
	if i`th and i+1`th elements out of order 
		Swap them

이렇게 교환이 일어나지 않을 때 즉 정렬이 완료된 상태일 때 버블 정렬의 하한은 Ω(n)이 됩니다.

상황에 따라서는 선택 정렬보다 더 빠른 방법이 될 수 있다는 것입니다.

상황에 따라서는

- 실행시간의 하한

Ω(n^2) : 선택 정렬

Ω(n log n)

Ω(n) : 버블 정렬

Ω(log n)

Ω(1) : 선형 검색, 이진 검색

이 될 수 있습니다.

 

선택 정렬의 실행시간의 하한도 더 단축시킬 수 있을까요?

개인적인 생각이지만 선택 정렬은 교환 횟수는 최소화시켜주지만 처음부터 끝까지 모든 값들을 비교하며 최솟값을 계속 찾아야 하기 때문에 실행시간의 하한은 변함없이 Ω(n^2)이 될 것 같습니다.

혹시 방법이 있다면 댓글로 달아주시면 더 찾아보고 공부하겠습니다. ㅎㅎ

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 알고리즘' 카테고리의 다른 글

[CS50] 병합 정렬  (0) 2021.08.17
[CS50] 재귀  (0) 2021.08.16
[CS50] 선택 정렬  (0) 2021.08.14
[CS50] 버블 정렬  (0) 2021.08.14
[CS50] 선형 검색  (0) 2021.08.13