CheerUp_Cheers

알고리즘 정렬기본 본문

CS

알고리즘 정렬기본

meorimori 2020. 5. 15. 01:26
  • 안정정렬?
  • 알고리즘이란?
  • 정렬 알고리즘 시간 복잡도 비교
  • 삽입정렬
  • 선택정렬
  • 쉘정렬
  • 버블정렬
  • 퀵정렬
  • 힙정렬
  • 병합정렬

https://roka88.dev/98


  • 안정정렬?

안정정렬은 동일한 값에 대해 기존의 순서가 유지되는 정렬을 말하며 불안정정렬은 반대로 동일한 값에 대해 기존의 순서가 뒤바뀔 수 있는 정렬입니다.

 


  • 알고리즘이란?

- 문제를 해결하기 위해 사용하는 방식

- 같은 문제라도 여러 알고리즘이 존재.

- 알고리즘을 생각할때는 효율도 같이 생각해야 함.

-


  • 정렬 알고리즘 시간 복잡도 비교

- 셀 정렬 최악 : 오름차순으로 정렬해야하는데 내림차순으로 되어 있을 경우.

- 퀵 정렬 최악 : 데이터 배열이 역순일 경우 최악의 경우.

 

  • O(N)

실행시간(1억일경우, 10^8) - 0.1s

카운팅
  • O(NLogN)

실행시간(1억일경우, 10^8) - 2.66s

힙,쉘,병합,퀵
  • O(N^2)

실행시간(1억일 경우, 10^8) -1157.days

삽입,선택 거품

 


  • 삽입정렬

- 정의

 (자기보다) 작은 수가 나올 때까지 우로 밀어 삽입하는 정렬

 정렬은 2번쨰 원소부터 시작, 그 앞의 원소들과 비교하여 삽입할 위치를 지정후, 뒤의 원소를 옮기고 지정된 자리에 삽입.

- 시간복잡도 : O(N^2), 최선의 경우 O(N)

- 안정성 : 일반적으로 있음.

- 장점

 1) 대부분의 원소가 이미 정렬되어 있으면 매우 효율적

 2) 다른 메모리 공간 필없음 => 제자리 정렬

 3) 안정 정렬

- 단점

 버블이나 선택처럼 배열의 길이가 길어질수록 비효율적.


  • 선택정렬

- 정의

 (순차적으로) 가장 작은 수를 선택하고 (반복) 교환하는 정렬

 해당 순서에 원소를 넣을 위치는 이미 정해져 있고,  그 자리에 올값 찾는 것.

- 시간 복잡도

 O(N^2), N-1 + N-2 + 1... => n(n-1)/2 => N^2

- 안정성 : 없음

- 장점

 1) 버블 정렬에 비해 실제로 교환하는 적어서 많은 교환이일어나는 자료상태에서 비교적효율.

 2) 다른 메모리공간 필 없음(제자리 정렬)

- 단점

 1) 불안정 정렬


  • 거품정렬

- 정의 : 좌측 값이 자기 보다 크면 교환하는 정렬

- 시간 복잡도 : O(N^2)

  n-1 + n-2... + 1 => n(n-1)/2 => N^2

- 안정성 : 일반적으로 있음(안정 절렬)

- 장점

 1) 구현간단, 직관적

 2) 정렬하고자하는 배열의 교환, 다른 메모리공간 필없음(제자리 정렬)

 3) 안정 정렬

- 단점

 1) 시간복잡도가 최악,최선,평균이 모두같아서 비효율

 2) 정렬돼있찌 않은 원소가 정렬된 자리로 가기위해 교환연산이 많이 일어남.

 

 


  • 쉘 정렬

정의 : (자기 보다) 작은수가 나올때 까지 간격만큼 우로 민다.(삽입정렬)

시간 복잡도 : 평균 O(N^1.5), 최악 O(N^2) 

안전성 : 없음


  • 퀵 정렬

- 정의

 좌측, 우측 값을 축 값과 비교하고 교환후 (재귀적) 분할하는 정렬

 분할 정복, 배열 가운데 하나의 원소를 고르고 피벗(자리안바뀜) 앞에는 작은거 뒤에는 큰거로 분할

 분할된 작은 영역에대해 재귀적 과정

- 시간 복잡도 :

 O(log2N), O(NlogN)

 최악의 경우 : 오름차순이거나 내림차순 정렬일 경우 O(N^2) => 분할이 나누어지지 않아.. 

- 안정성 : 없음

- 장점

 1) 한번 결정된 피벗들이 추후 연산에서 제외되어 빠름

 2) 다른 메모리 공간 필요없음(정렬하고자하는 배열안에서 교환)

- 단점

 1) 불안정 정렬

 2) 정렬된 상태에서는 불균형 분할로 오히려 수행시간 뻇음

 

- 순서

1) 좌측 값이 '축'값 보다 크거나 같은것을 찾을떄까지 비교.

2) 우측 값이 '축'값 보다 작거나 같은것을 찾을떄까지 비교.

3) 좌측값과 우측값을 교환.

4) 좌측 인덱스가 우측 인덱스 보다 크면 배열을 분할.

5) 재귀 반복


  • 힙 정렬

- 정의

 우선순위 큐를 이용, 다운 힙 , 업 힙 연산으로 정렬

 완전 이진 트리르 기본으로 하는 힙 자료구조 기반.

 삽입할떄 왼쪽부터 차례대로 추가하는 이진트리.

- 시간 복잡도 : O(NlogN)

  -> 힙트리의 전체 높이가 거의 log2n(완전 이진트리) 이니, 하나의 요소를 힙에 삽입하거나 삭제시 log2n

   요소의 개수가 n개임으로 전체적으로 O(nlog2n)

- 안정성 : 동일한 값에 대한 기준이 별도로 있어야한다. 또는 동일한 값의 존재를 부정.(불안정)

- 최대 힙 : 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리

 

- 순서

 1) 최대 힙 루트의 최대값을 마지막요소와 바꾼후, 힙사이즈 줄임

 2) 큰거 추출

 3) 정렬

 4) 힙사이즈가 1보다 크면 계쏙 반복


  • 병합 정렬(합병정렬)

- 정의

 (최소 단위까지) 배열을 (재귀적으로) 분할 후, 병합 시 (부분 배열의) 앞에서 부터 비교 삽입 하는 정렬.

 쪼개는 방식은 퀵정렬과 유사(분할정복)

 차이점

  퀵정렬 : 피벗을 통해 정렬 -> 영역을 쪼갬

  합병 : 영역을 쪼갤수있을만금 쪼갬 -> 정렬

- 시간 복잡도 : 모두 O(NlogN)

- 안정성 : 안정성이 있다.

- 장점

 1) 합병정렬은 순차적인 비교로 정렬을 진행, 링크드리스트의 정렬에 효율

    -> 퀵정렬은 순차접근이 아닌 임의접근이라 오버헤드

'CS' 카테고리의 다른 글

소프트웨어 공학  (0) 2020.11.22
알고리즘 심화  (0) 2020.05.15
  (0) 2020.05.09
디자인 패턴  (0) 2020.02.18
ETC  (0) 2020.02.11