데이터를 순차적으로 저장하는 가장 기본적인 두 가지 선형 자료구조입니다. 하지만 메모리상에서의 동작 방식은 완전히 다릅니다.
연속된 메모리 공간에 나란히 저장된 데이터의 집합
배열은 같은 타입의 데이터가 메모리상에 연속적으로 저장되는 구조입니다.
가장 큰 특징은 인덱스(Index)를 통해 데이터에 직접 접근(Random Access)할 수 있다는 점입니다. 0번부터 시작하는 인덱스를 알면, [주소 + 인덱스 데이터 타입 크기] 공식을 통해 O(1)의 속도로 원하는 값을 즉시 찾아낼 수 있습니다.
주요 특징:
데이터와 포인터가 한 몸! 노드(Node)들이 사슬처럼 연결된 구조
연결 리스트는 데이터가 메모리상에 흩어져 저장됩니다. 각 데이터는 값(Value)과 다음 노드를 가리키는 포인터(Pointer/Next)를 함께 가진 '노드(Node)'라는 단위로 존재합니다.
데이터에 접근하려면 반드시 첫 번째 노드(Head)부터 포인터를 따라 순차적으로 이동해야 합니다.
// 연결 리스트의 노드 구조 (Java 예시)
class Node {
Object data; // 실제 데이터
Node next; // 다음 노드를 가리키는 포인터
Node(Object data) {
this.data = data;
this.next = null;
}
}
주요 특징
| 특징 | 배열 (Array) | 연결 리스트 (Linked List) |
|---|---|---|
| 데이터 접근 (읽기) | O(1) (매우 빠름) | O(n) (느림) |
| 데이터 삽입/삭제 | O(n) (느림) | O(1) (해당 노드 접근 후) |
| 메모리 구조 | 연속적인 공간 (Cache-friendly) | 불연속적인 공간 |
| 메모리 크기 | 정적 (Static) | 동적 (Dynamic) |
| 추가 공간 | 없음 | 포인터를 위한 추가 공간 필요 |
| 주요 사용처 | 데이터 조회/접근이 빈번할 때 | 데이터 삽입/삭제가 빈번할 때 |
데이터를 저장하는 방식에 특별한 규칙을 적용한 자료구조들입니다.
LIFO (Last-In, First-Out) : 마지막에 들어온 것이 가장 먼저 나간다
스택은 한쪽 끝에서만 데이터가 들어가고(Push) 나가는(Pop) 구조입니다. 마치 쌓아 올린 접시나 프링글스 통을 생각하면 쉽습니다.
Push(data): 스택의 맨 위에 데이터를 추가합니다.Pop(): 스택의 맨 위 데이터를 꺼내고(삭제) 반환합니다.Peek(): 스택의 맨 위 데이터를 삭제하지 않고 조회만 합니다.FIFO (First-In, First-Out) : 먼저 들어온 것이 가장 먼저 나간다
큐는 한쪽 끝(Rear)에서는 데이터가 들어가고(Enqueue), 반대쪽 끝(Front)에서는 나오는(Dequeue) 구조입니다. 은행 창구의 대기 줄과 같습니다.
Enqueue(data): 큐의 맨 뒤(Rear)에 데이터를 추가합니다.Dequeue(): 큐의 맨 앞(Front) 데이터를 꺼내고(삭제) 반환합니다.Peek(): 큐의 맨 앞 데이터를 삭제하지 않고 조회만 합니다.우선순위 큐 (Priority Queue) : 가장 중요한(크거나 작은) 데이터가 먼저 나온다
힙은 일반적인 스택이나 큐와 달리, 우선순위가 가장 높은 데이터를 가장 먼저 꺼낼 수 있도록 설계된 자료구조입니다. '완전 이진 트리' 구조를 기반으로 합니다.
Insert(data): 데이터를 힙에 추가하고, 힙의 구조를 재조정합니다. (O(log n))Extract(): 루트 노드(최댓값 또는 최솟값)를 꺼내고, 힙의 구조를 재조정합니다. (O(log n))데이터를 순서대로 나열하는 알고리즘 중, 가장 효율이 좋은 O(n log n) 복잡도의 대표 3인방입니다.
기준(Pivot)을 잡아라! 기준보다 작은 건 왼쪽, 큰 건 오른쪽
이름처럼 평균적으로 가장 빠른 속도를 자랑하는 분할 정복 (Divide and Conquer) 알고리즘입니다.
일단 쪼개고, 나중에 합치면서 정렬한다
안정적인 성능을 보장하는 분할 정복 (Divide and Conquer) 알고리즘입니다.
힙(Heap) 자료구조를 이용한 정렬
위에서 설명한 '힙' 자료구조를 활용하는 정렬 방식입니다. (보통 '최대 힙' 사용)
| 알고리즘 | 평균 시간 복잡도 | 최악 시간 복잡도 | 공간 복잡도 (추가 메모리) | 안정성 (Stable) |
|---|---|---|---|---|
| 퀵 정렬 | O(n log n) | O(n^2) | O(log n) (In-place) | X (불안정) |
| 병합 정렬 | O(n log n) | O(n log n) | O(n) | O (안정) |
| 힙 정렬 | O(n log n) | O(n log n) | O(1) (In-place) | X (불안정) |
가독성이 좋아용! 잘 읽었습니다~