정렬(Sorting)

·2023년 10월 14일
0

알고리즘

목록 보기
5/23
post-thumbnail

시간 복잡도와 공간 복잡도

  • 시간 복잡도 : 알고리즘의 수행시간을 의미하는 지표
  • 공간 복잡도 : 알고리즘의 메모리 사용량

선택 정렬(selection sort)

  • 데이터 중 가장 작은 값의 데이터를 선택하여 앞으로 보냄
  • worst, average, best 시간 복잡도 : O(n^2). 모두 동일

삽입 정렬(insertion sort)

  • 데이터를 순서대로 뽑아 적절한 위치를 찾아 삽입함으로써 완성하는 정렬
  • 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교해 자신의 위치를 찾아 삽입
  • 배열이 길어질수로 효율이 떨어짐
  • 구현이 간단
  • 무조건 위치를 변경하는 선택 정렬과 달리 필요할 때에 삽입한다는 점에서 효율적
  • 이미 정렬된 데이터가 많으면 효율적
  • best 시간 복잡도 : O(n)
  • average, worst 시간 복잡도 : O(n^2)

버블 정렬(bubble sort)

  • 옆에 있는 데이터와 비교하여 더 작은 값을 앞으로 보냄
  • worst, average, best 시간 복잡도 : O(n^2)
  • 선택 정렬, 삽입 정렬과 시간 복잡도가 같지만 연산 수가 많아 느리고 효율성 떨어짐
  • 느리지만 코드가 단순해 사용

합병 정렬(merge sort)

  • 비교 기반 정렬 알고리즘
  • 분할, 정렬, 결합 순으로 진행되는데 데이터 배열을 2개 이상의 부분 배열로 분할고 부분 배열에서 정렬한 뒤 결합해 다시 정렬을 진행
  • 데이터 배열 전체가 다시 결합되고 정렬되면서 마침
  • worst, average, best 시간 복잡도 : O(NlogN)
  • 장점
    • 데이터를 정확히 반으로 나누고 정렬하기 때문에 항상 일정한 시간 복잡도 유지 -> 데이터 분포에 영향을 덜 받음. 퀵 정렬의 한계점 보완.
  • 단점 : 다른 알고리즘과 비교했을 때 O(n) 수준의 메모리가 추가로 필요. 레코드를 배열(Array)로 구성하면, 임시 배열이 필요하기 때문

퀵 정렬(quick sort)

  • 데이터 중 임의의 기준값을 정해 두 부분집합으로 나눔
  • 이때 기준 값 : 피벗(pivot)
  • 왼쪽은 피벗보다 작은 값, 오른쪽은 피벗보다 큰 값을 배치하고 더 이상 집합을 나눌 수 없을 때 까지 재귀적으로 실행
  • average, best 시간 복잡도 : O(NlogN)
  • worst 시간 복잡도 : O(n^2)
  • 수평선은 피벗 값
  • 정렬을 위해 평균적으로 O(logN) 만큼의 메모리를 필요로 함. 이는 재귀적 호출로 발생하는 것이며, 최악의 경우 O(n) 공간복잡도 가짐
  • 이미 정렬된 데이터라면 매우 비효율적으로 동작

Reference

위키백과
https://aiday.tistory.com/53

0개의 댓글