티스토리 뷰

개발일기/알고리즘

정렬 알고리즘

노럭맨 2020. 3. 13. 18:39

알고리즘 공부하면서 정리도 하기로 했음.

개인공부용이라 정리가 제 맘대로일 수 있습니다.

 

Selection Sort 선택정렬

제일 낮은 거 선택해서 맨 앞으로 보내는 가장 직관적인 그 알고리즘!

간단한거라면 굳이어려운걸 하기 보다 걍 파악하기 쉽게 이 알고리즘을 쓰는 것도 좋다만,

데이터가 크면 클수록 시간복잡도가 높아지기에 굳이 할 필요 없는 그 알고리즘

초보자용이랄까?

풋내기용이라니 마치 나같군

1부터 10을 정렬하려면 55번의 비교연산이 필요함.  근데 만개의 데이터라면 일억번해야됨.

근데 심지어 더 줄어들지도 않음. 애당초 1,2,3,4,5,6,7,8,9,10 으로 되어있어도 55번 비교함.

시간복잡도 = O(n^2)

 

Bubble Sort 버블정렬

옆에 있는 녀석과 비교해서 더 작은값을 앞으로 보낸다.

와 이해하기 정말 쉽다~ 군대나 학교에서 운동장에 쭈욱 서있을 때 앞 뒷사람만 키 비교해서 정렬을 자연스럽게 할 수 있네?

너무 좋다~ 코드도 너무 쉽게 구현될 것 같아. 그러니까 빠르겠지?

이지만 시간복잡도로 생각하면 그게 아님.

결국 10 + 9 +.. 의 횟수를 해야하는데 

실제론 선택정렬과 비교해서 자리를 바꾸는 걸 계속 하기 때문에 연산량은 선택정렬보다도 많다구....

시간복잡도 = O(N^2)

 

Insertion Sort 삽입정렬

 

숫자를 적절한 위치에 삽입한다!

위에꺼 두 개랑 다르게 필요할 때만 위치를 바꾼다.

앞에서부터 정렬을 해나가는데

정렬이 되어있는 상태니까 현재의 원소가 멈출 포인트까지만 확인할 수 있음.

그런데 최악의 경우를 가정하면 위에껏들과 시간복잡도가 다르진 않지만

실제로는 위의 두 정렬(선택정렬, 버블정렬)보단 훨 나음

삽입정렬이 유용할 때는 언제냐면 정렬이 많이 되어있는 데이터의 경우에 상당히 빠르게 할 수 있다~

시간복잡도 = O(N^2)

 

Quick Sort 퀵정렬

 

매우매우 중요한 정렬. 노말한 경우에는 이걸 쓰는 게 좋다.

근데 처음에 이해는 잘 안되었음.

이렇게 함

1. 피벗을 설정한다. 첫 위치에 있는 값으로 설정.

2. 데이터의 시작지점부터 피벗보다 큰 녀석을 찾는다

3. 데이터의 끝지점부터 피벗보다 작은 녀석을 찾는다.

4. 2와 3을 잘 찾았으면 둘의 위치를 바꿔줌.

5. 2가 3보다 더 큰 위치에 있다면, 둘이 엇갈린거임. 이 때는 3번에서 찾은 것과 키값을 바꿔줌

6. 이제 원래 키값이었던 아이가 들어간 위치에 그 녀석을 고정시키고 걔를 기준으로 왼쪽 그룹과 오른쪽 그룹을 1~5를 반복한다.

 

귀찮아서 대충 적었는데 암튼

일반적으로 아주 빠른 정렬이지만

이미 정렬이 잘 되어있는 경우에는 삽입 정렬보다 느리다.

맹신하면 안된다 이말이다

 

시간복잡도 = O(nN*logN)

 

--
이렇게 4개의 정렬이 기초 정렬 4대장임.

다들 쉬운 알고리즘임. 

 

업데이트 예정...

댓글
최근에 올라온 글
Total
Today
Yesterday
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31