미새문지

정렬 알고리즘 본문

공부 키워드/알고리즘 및 데이터 구조

정렬 알고리즘

문미새 2024. 3. 27. 16:11
728x90

정렬 알고리즘

정렬 알고리즘은 데이터를 특정한 기준에 따라 순서대로 배열하는 방법이다.

이러한 알고리즘은 데이터 처리의 효율성을 높이고, 정보를 쉽게 찾거나 이해할 수 있도록 도와준다.

 

정렬 알고리즘 종류

버블 정렬(Bubble Sort)

https://gyoogle.dev/blog/algorithm/Bubble%20Sort.html

버블 정렬은 정렬과정에서 데이터의 원소들이 거품이 물 위로 올라오는 것처럼, 각 원소들이 서로의 위치를 바꾸며 최종적인 위치를 찾아가는 과정을 거친다.

 

버블 정렬의 기본 원리

  • 인접한 두 원소를 비교하여 크기 순서대로 정렬하는 알고리즘이며, 인접한 원소의 순서가 바뀌어야 한다면 두 원소의 위치를 교환한다.
  • 첫 번째 원소부터 시작하여 바로 다음 원소와 비교하고, 조건에 맞다면 위치를 교환하여 배열의 끝까지 반복한다.
  • 각 단계마다 가장 큰 원소가 배열의 끝으로 이동하며, 이러한 과정을 배열의 모든 원소가 정렬될 때까지 반복한다.

 

버블 정렬의 특징

  • 시간 복잡도 : 평균 및 최악의 경우 O(n^2)이며, n은 배열의 길이이다.
  • 공간 복잡도 : O(1)이며, 추가적인 메모리를 거의 사용하지 않는다. 제자리 정렬 알고리즘에 속함
  • 안정성 : 버블 정렬은 안정 정렬이다. 동일한 값을 가진 요소의 상대적인 순서가 정렬 과정에서 변경되지 않는다.
  • 단점 : 비교적 느린 정렬 속도로 인해 대규모 데이터 셋에는 적합하지 않는다.

버블 정렬은 구현이 간단하고 직관적이기 때문에 자주 접하는 정렬 알고리즘이다. 하지만 효율 측면에서는 다른 고급 정렬 알고리즘에 비해 뒤떨어지므로, 실제 대규모 데이터를 다룰 때는 다른 알고리즘을 고려하는 것이 좋다.

 

선택 정렬(Selection Sort)

https://gyoogle.dev/blog/algorithm/Selection%20Sort.html

선택 정렬은 주어진 배열에서 최소값이나 최대값을 찾아 맨 앞이나 맨 뒤에 위치한 값과 교환하는 정렬방식이다.

이 과정을 배열의 모든 원소에 대해 반복하여 전체 배열을 정렬한다.

 

선택 정렬의 기본 원리

  • 정렬되지 않은 데이터들 중에서 가장 작은 데이터를 찾아 가장 앞의 데이터와 교환해나가는 방식이다.
  • 주어진 리스트 중 최소값을 찾아 맨 앞에 위치한 값과 교체하며, 이 후 맨 처음 위치를 제외한 나머지 리스트에 대해 같은 방법으로 교체를 반복한다.

선택 정렬의 특징

  • 시간 복잡도 : 평균 및 최악의 경우 O(n^2)이며, n은 배열의 길이이다.
  • 공간 복잡도 : O(1)이며, 추가적인 메모리를 거의 사용하지 않는다. 제자리 정렬 알고리즘에 속함
  • 안정성 : 선택 정렬은 불안정 정렬이다. 동일한 값을 가진 요소의 상대적인 순서가 정렬 과정에서 변경될 수 있다.
  • 장점 : 구현이 간단하고 메모리 사용량이 적다.
  • 단점 : 시간 복잡도가 O(n^2)이기 때문에, 데이터 양이 많을 경우 비효율적일 수 있다.

선택 정렬은 구현이 간단하고 메모리 사용량이 적다는 단점이 있지만, 대규모 데이터 셋에는 적합하지 않은 정렬 방법이다. 따라서 데이터 양이 많을 경우 다른 효율적인 정렬 알고리즘을 고려하는 것이 좋다.

 

삽입 정렬(Insertion Sort)

https://gyoogle.dev/blog/algorithm/Insertion%20Sort.html

삽입 정렬은 배열의 각 요소를 적절한 위치에 삽입하는 방식으로 배열을 정렬하는 알고리즘이다.

손 안의 카드를 정렬하는 것과 유사한 방식으로, 이미 정렬된 배열 부분에 새로운 요소를 적절한 위치에 삽입해 나가면서 전체 배열을 정렬한다.

 

삽입 정렬의 기본 원리

  • 삽입 정렬은 두 번째 요소부터 시작하여, 그 앞의 요소들과 비교해 삽입할 위치를 찾아 삽입하는 방식으로 정렬을 진행한다.
  • 각 요소를 이미 정렬된 배열 부분과 비교해 해당 요소가 들어갈 적절한 위치를 찾은 후 그 위치에 삽입하며, 배열의 모든 요소에 대해 반복한다.

삽입 정렬의 특징

  • 시간 복잡도 : 최선의 경우 O(n), 평균 및 최악의 경우 O(n^2)이며, n은 배열의 길이이다.
  • 공간 복잡도 : O(1)이며, 추가적인 메모리를 거의 사용하지 않는다. 제자리 정렬 알고리즘에 속함
  • 안정성 : 삽입 정렬은 안정 정렬이다. 동일한 값을 가진 요소의 상대적인 순서가 정렬 과정에서 유지된다.
  • 장점 : 구현이 간단하고, 작은 데이터셋에 대해서는 매우 효율적이다. 또한, 거의 정렬된 배열에 대해서는 매우 빠른 성능을 보인다.
  • 단점 : 배열의 크기가 커질수록, 혹은 배열이 역순으로 정렬되어 있을 경우 비효율적일 수 있다.

삽입 정렬은 구현의 단순함과 작은 데이터셋에 대한 높은 효율성으로 인해 많이 사용되는 정렬 알고리즘이며, 거의 정렬된 데이터에 대해서는 매우 빠른 성능을 보여주기 때문에 이러한 상황에선 삽입 정렬을 고려하는 것이 좋다.

 

퀵 정렬(Quick Sort)

https://gyoogle.dev/blog/algorithm/Quick%20Sort.html

퀵 정렬은 평균적으로 매우 빠른 속도를 가지고 있는 정렬 방식으로, 피벗(pivot)을 기준으로 배열을 분할하여 정렬하는 방식을 취한다. 분할 정복(divide and conquer) 전략을 사용

 

퀵 정렬의 기본 원리

  • 피벗 선택(Pivot) : 주어진 배열에 하나의 요소를 피벗으로 선택한다. 피벗의 선택 방법에 따라 알고리즘의 성능이 크게 달라질 수 있다.
  • 분할(Divide) : 배열을 피벗을 기준으로 피벗보다 작은 값은 왼쪽에 큰 값은 오른쪽에 배치한다. 이 과정을 통해 배열이 두 부분으로 나뉜다.
  • 정복(Conquer) : 나뉜 두 배열에 대해 같은 과정(피벗 선택, 분할)을 재귀적으로 반복한다.
  • 결합(Combine) : 더 이상 분할할 수 없을 때까지 진행한 후, 모든 부분 배열이 정렬된 상태로 결합된다. 

퀵 정렬의 특징

  • 시간 복잡도 : 평균 및 최선의 경우 O(n log n), 최악의 경우 O(n^2)이다. 피벗의 위치에 따라 성능이 크게 달라진다.
  • 공간 복잡도 : O(log n)의 추가 메모리를 필요로 하는데, 이는 재귀 호출의 깊이에 따라 달라진다.
  • 장점 : 대부분의 경우 매우 빠른 정렬 속도를 보이며 특히, 내부 루프가 대부분의 컴퓨터 아키텍처에서 효율적으로 작동한다.
  • 단점 : 최악의 경우 시간 복잡도가 O(n^2)까지 늘어날 수 있으며, 이는 피벗 선택에 따라 달라진다.

퀵 정렬은 빠른 속도와 효율성으로 인해 많은 상황에서 선호되는 정렬 알고리즘이며, 적절히 피벗 설정을 하면 대부분의 경우에서 최적의 성능을 발휘할 수 있다.

 

병합 정렬(Merge Sort)

https://velog.io/@emily0_0/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Merge-Sort

병합 정렬은 분할정복(divide and conquer) 전략을 사용하여 배열이나 리스트를 정렬하는 방식이다.

존 폰 노이만(John von Neumann)에 의해 1945년에 개발되었다.

 

병합 정렬의 기본 원리

  • 분할(Divide) : 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분을 리스트로 나눈다.
  • 정복(Conquer) : 각 부분 리스트를 재귀적으로 병합 정렬을 이용해 정렬한다.
  • 결합(Combine) : 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다. 이 과정에서 추가적인 리스트가 필요할 수 있다.

병합 정렬의 특징

  • 시간 복잡도 : 최악의 경우에도 O(n log n)을 보장하는데, 이는 병합 정렬이 분할 단계에서 리스트를 절반으로 나누고, 각 단계에서 n번의 비교를 수행하기 때문이다.
  • 공간 복잡도 : O(n)의 추가 공간을 필요로 한다. 정렬과정에서 추가 배열이 필요하기 때문에 비제자리 정렬에 속함
  • 안정성 : 동일한 값을 가진 요소의 상대적인 순서가 정렬 후에도 유지되지만, 정렬 과정에서 원본 배열 외에 추가적인 공간을 필요로 한다.
  • 장점 : 최악의 경우에도 O(n log n)의 시간 복잡도를 보장하고 안정 정렬 방식이므로 동일한 값을 가진 요소의 순서가 유지된다.
  • 단점 : 추가적인 메모리 공간을 필요로 한다. 이는 특히 메모리가 제한적인 환경에서는 단점이 될 수 있다.

병합 정렬은 안정성과 최악의 경우에도 보장되는 효율적인 시간 복잡도로 인해 많은 상황에서 유용하게 사용되며, 특히 대규모 데이터를 다룰 때 자주 쓰이게 된다.

 

힙 정렬(Heap Sort)

https://herong.tistory.com/entry/%ED%9E%99-%EC%A0%95%EB%A0%ACHeap-Sort

힙 정렬은 완전 이진 트리를 기반으로 하는 효율적인 정렬 알고리즘이며, 이 알고리즘은 배열 내의 요소들을 힙 구조로 조정한 뒤, 최댓값이나 최솟값을 배열의 끝으로 이동시키는 과정을 반복하여 전체 배열을 정렬한다.

 

힙 정렬의 기본 원리

  • 정렬해야 할 요소들로 최대 힙 또는 최소 힙을 만든다.(heapify)
    • heapify : 주어진 데이터를 힙 구조로 만드는 과정을 의미하며, 특정 노드를 루트로 하는 서브 트리가 힙 성질을 유지하도록 하여 전체 트리가 힙이 되게 한다.
  • 최대 힙에서는 최댓값을 최소 힙에서는 최솟값을 힙에서 제거하고 배열의 끝으로 이동시킨다.
  • 이 과정을 모든 요소가 정렬될 때까지 반복한다.

힙 정렬의 특징

  • 시간 복잡도 : 최악의 경우에도 O(n log n)을 보장한다. 힙을 구성하는데 O(n) 시간이 걸리고 각 요소를 힙에서 제거하고 배열에 삽입하는 데 O(log n) 시간이 걸린다.
  • 공간 복잡도 : O(1)이다. 힙 정렬은 제자리 정렬 방식으로 추가적인 메모리를 거의 사용하지 않는다.
  • 안정성 : 비안정 정렬이며, 동일한 값을 가진 요소의 상대적인 순서가 정렬 후에 바뀔 수 있다.
  • 장점 : 최악의 경우에도 O(n log n)의 시간 복잡도를 보장한다. 추가적인 메모리 사용이 거의 없어 메모리 효율성이 높다.
  • 단점 : 비안정 정렬이기 때문에 동일한 값을 가진 요소의 순서가 유지되지 않을 수 있다. 평균적으로 퀵 정렬보다 느릴 수 있다.

힙 정렬은 효율성과 메모리 사용의 최적화로 인해 대규모 데이터를 다룰 때 유용하게 사용되며, 특히 제한된 메모리 환경에서의 정렬에 매우 적합하다.

728x90

'공부 키워드 > 알고리즘 및 데이터 구조' 카테고리의 다른 글

스택(Stack), 큐(Queue)  (3) 2024.03.29
연결 리스트(Linked List)  (1) 2024.03.29
시간 복잡도(Big-oh Notaion)  (1) 2024.03.28
반복문과 재귀함수  (1) 2024.03.27
배열과 문자열  (2) 2024.03.26