본문 바로가기

알고리즘, 자료구조/정렬5

Tim Sort -목차- 1. Tim sort의 등장 2. Tim sort의 기본 원리 3. Tim sort의 최적화 기법 3.1 Run 3.2 Binary Insertion Sort 3.3 Merge 4. Galloping 참고 자료 1. Tim sort의 등장 2002년 소프트웨어 엔지니어 Tim Peters에 의하여 Tim sort가 등장했다. 이 정렬 알고리즘은 Insertion sort와 Merge sort를 결합하여 만든 정렬이다. 실생활 데이터의 특성을 고려하여 더욱 빠르게 고안된 이 알고리즘은 최선의 시간 복잡도는 \(O(n)\), 평균은 \(O(n\log n)\), 최악의 경우 시간 복잡도는 \(O(n\log n)\)이다. Tim sort는 안정적인 두 정렬 방법을 결합했기에 안정적이며, 추가 메모리는 .. 2022. 2. 17.
합병 정렬(Merge Sort) [Python / 파이썬] -목차- 1. 합병 정렬(Merge Sort) 2. 합병 정렬의 시간 복잡도 3. 합병 정렬의 특성 1. 합병 정렬(Merge Sort) 합병 정렬 또는 병합 정렬(merge sort)은 O(n log n) 비교 기반 정렬 알고리즘이다. 일반적인 방법으로 구현했을 때 이 정렬은 안정 정렬에 속하며, 분할 정복 알고리즘의 하나이다. 합병 정렬은 아래와 같은 알고리즘으로 동작한다. 배열을 원소가 하나밖에 남지 않을 때까지 계속 둘로 쪼갠다. 더 이상 쪼갤 수 없는 각각의 배열을 합병하며 정렬한다 이때 크기 순으로 재배열하며 힙병이 이루어진다. 이해를 돕기 위해 예제를 통해 자세한 동작 원리를 알아보자. 예를 들어, 아래와 같이 1부터 8까지 총 8개의 숫자가 들어있는 배열에 있다고 가정해보자. [6, 5, .. 2022. 2. 17.
퀵 정렬(Quick Sort) [Python / 파이썬] 1. 퀵 정렬 퀵 정렬은 기준을 설정한 다음 큰 수와 작은 수를 교환한 후 리스트를 반으로 나누는 방식으로 동작한다. 퀵 정렬에서는 피벗(Pivot)이 사용된다. 큰 숫자와 작은 숫자를 교환할 때, 교환하기 위한 '기준'을 바로 피벗이라고 표현한다. 퀵 정렬을 수행하기 전에는 피벗을 어떻게 설정할 것인지 미리 명시해야 한다. 피벗을 설정하고 리스트를 분할하는 방법에 따라서 여러 가지 방식으로 퀵 정렬을 구분하는데, 가장 대표적인 분할 방식인 호어 분할(Hoare Partition) 방식을 기준으로 퀵 정렬을 정리해 보도록 하겠다. 호어 분할 방식에서는 리스트의 첫 번째 데이터를 피벗으로 정한다. 이와 같이 피벗을 설정한 뒤에는 왼쪽에서부터 피벗보다 큰 데이터를 찾고, 오른쪽에서부터 피벗보다 작은 데이터를.. 2022. 1. 17.
삽입 정렬 [Python / 파이썬] 1. 삽입 정렬(Insertion Sort) 삽입 정렬은 특정한 데이터를 적절한 위치에 '삽입'한다는 의미에서 삽입 정렬(Insertion Sort)라고 부른다. 더불어 삽입 정렬은 특정한 데이터가 적절한 위치에 들어가기 이전에, 그 앞까지의 데이터는 이미 정렬되어 있다고 가정한다. 정렬되어 있는 데이터 리스트에서 적절한 위치를 찾은 뒤에, 그 위치에 삽입된다는 점이 특징이다. 삽입 정렬은 선택 정렬에 비해 실행 시간 측면에서 더 효율적인 알고리즘으로 잘 알려져 있다. 특히 삽입 정렬은 필요할 때만 위치를 바꾸므로 '데이터가 거의 정렬되어 있을 때' 훨씬 효율적이다. 선택 정렬은 현재 데이터의 상태와 상관없이 무조건 모든 원소를 비교하고 위치를 바꾸는 반면 삽입 정렬은 그렇지 않다. 선택 정렬 2022... 2022. 1. 6.