Post

⚡ 알고리즘 - 퀵정렬, 병합정렬, 힙정렬

⚡ 알고리즘 - 퀵정렬, 병합정렬, 힙정렬

🔹 퀵정렬(Quick Sort)

▫️ 개념

  • 기준 원소(pivot)를 선택하여 배열을 두 부분으로 나누고, 왼쪽은 pivot 이하, 오른쪽은 큰 값이 되도록 분할한 뒤 재귀적으로 정렬하는 분할 정복 알고리즘

▫️ 시간 복잡도

  • 평균: O(n log n)
  • 최악: O(n²)
  • 공간복잡도: O(log n)

🔹 특징

  • 인-플레이스 정렬
  • 불안정 정렬

🔹 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class QuickSort {
	public static void quickSort(int[] arr, int left, int right) {
		if (left >= right) return;
		
		int index = partition(arr, left, right);
		quickSort(arr, left, index - 1);
		quickSort(arr, index, right);
	}

	private static int partition(int[] arr, int left, int right) {
		int pivot = arr[(left + right) / 2];
		
		while (left <= right) {
			while (arr[left] < pivot) left++;
			while (arr[right] > pivot) right--;
			
			if (left <= right) {
				swap(arr, left, right);
				left++;
				right--;
			}
		}
		
		return left;
	}
	
	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
	
	public static void main(String[] args) {
		int[] arr = {3, 6, 8, 10, 1, 2, 1};
		quickSort(arr, 0, arr.length - 1);
		for (int num : arr) {
			System.out.print(num + " ");
		}
	}
}

🔹 병합정렬(Merge Sort)

▫️ 개념

  • 배열을 반으로 나누어 각각 정렬 후 두 정렬된 배열을 병합하는 분할 정복 알고리즘

▫️ 시간 복잡도

  • O(n log n)
  • 공간복잡도: O(n)

▫️ 특징

  • 안정 정렬
  • 추가 메모리 사용

▫️ 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class MergeSort {
	public static void mergeSort(int[] arr, int left, int right) {
		if (left >= right) return;
		int mid = (left + right) / 2;
		mergeSort(arr, left, mid);
		mergeSort(arr, mid + 1, right);
		merge(arr, left, mid, right);
	}

	private static void merge(int[] arr, int left, int mid, int right) {
		int[] temp = new int[right - left + 1];
		int i = left, j = mid + 1, k = 0;
		
		while (i <= mid && j <= right) {
			if (arr[i] <= arr[j]) {
				temp[k++] = arr[i++];
			} else {
				temp[k++] = arr[j++];
			}
		}
		while (i <= mid) temp[k++] = arr[i++];
		while (j <= right) temp[k++] = arr[j++];
		
		System.arraycopy(temp, 0, arr, left, temp.length);
	}
	
	public static void main(String[] args) {
		int[] arr = {3, 6, 8, 10, 1, 2, 1};
		mergeSort(arr, 0, arr.length - 1);
		for (int num : arr) {
			System.out.print(num + " ");
		}
	}
}

🔹 힙정렬(Heap Sort)

▫️ 개념

  • 힙 자료구조를 이용해 최대값을 반복해서 제거하며 정렬하는 알고리즘

▫️ 시간 복잡도

  • O(n log n)
  • 공간복잡도: O(1)

▫️ 특징

  • 불안정 정렬
  • 일정한 성능 보장

▫️ 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class HeapSort {
	public static void heapify(int[] arr, int n, int i) {
		int largest = i;
		int left = 2 * i + 1;
		int right = 2 * i + 2;
		
		if (left < n && arr[left] > arr[largest])
			largest = left;
		if (right < n && arr[right] > arr[largest])
			largest = right;
		if (largest != i) {
			int temp = arr[i];
			arr[i] = arr[largest];
			arr[largest] = temp;
			heapify(arr, n, largest);
		}
	}
	
	public static void heapSort(int[] arr) {
		int n = arr.length;
		for (int i = n / 2 - 1; i >= 0; i--)
			heapify(arr, n, i);
			
		for (int i = n - 1; i > 0; i--) {
			int temp = arr[0];
			arr[0] = arr[i];
			arr[i] = temp;
			heapify(arr, i, 0);
		}
	}
	
	public static void main(String[] args) {
		int[] arr = {3, 6, 8, 10, 1, 2, 1};
		heapSort(arr);
		for (int num : arr) {
			System.out.print(num + " ");
		}
	}
}

🔹 비교

알고리즘평균시간복잡도최악시간복잡도공간복잡도안정성특징
퀵정렬O(n log n)O(n²)O(log n)불안정인-플레이스, 빠름
병합정렬O(n log n)O(n log n)O(n)안정항상 일정 성능
힙정렬O(n log n)O(n log n)O(1)불안정인-플레이스, 일정한 성능

🔹 참고

  • 인-플레이스 정렬(In-place sorting)은 큰 메모리 공간 없이 주어진 배열 안에서 직접 데이터 위치를 바꿔서 정렬하는 방법을 의미한다.
  • 불안정 정렬은 값이 같은 데이터의 순서가 바뀔 수 있음을 의미한다.
This post is licensed under CC BY 4.0 by the author.