티스토리 뷰

1. 퀵 정렬(Quick Sort)이 나온 배경


배열 안에 있는 원소들을 정렬하기 위한 방법으로 "선택 정렬, 삽입 정렬, 버블 정렬" 이라는 방법을 사용했다면

이는 시간 복잡도가 O(n^2)인 알고리즘으로,

데이터가 커지면 커질 수록 계산 시간이 급격하게 증가하는 치명적인 단점을 보유하고 있다.

 

이러한 문제를 해결하기 위해,

도입된 정렬 알고리즘이 분할 정복 전략(Divide n Conquer Strategy)을 이용한 알고리즘이고, 대표적으로 퀵 정렬이 있다.

 

2. 퀵 정렬(Quick Sort)에 대한 대략적인 개념


앞서 말했다시피, 퀵 정렬은 분할 정복 전략을 이용해서 정렬을 수행하는데,

 

1) 여기서, 분할 정복 전략은 무엇일까?

특정 문제(main problem)를 해결하기 위해서 그 문제와 관련된 여러개 작은 문제(sub problems)로 나누고,
이러한 작은 문제에 대한 결과 값을 종합해서(Combination), 특정 문제를 해결하는 전략이라고 한다.

 

2) 그렇다면 이러한 전략을 어떻게 이용해서 퀵 정렬 알고리즘이 수행될까?

간단하게 애기하자면 아래와 같다,

Array(배열)에서 특정한 값(Pivot)을 잡고 그 값을 기준으로 작은 배열, 큰 배열로 분할하자

 

전체 배열에 있는 모든 원소들을 모두 비교하는 과정은 어려운 문제이니,

-> 전체 배열의 특정 값(Pivot)을 기준으로 그것 보다 작은 것들의 집합, 큰 것들의 집합으로, 두 집합으로 나누면서

-> 비교 과정을 수행하자는 것이다.

3. 퀵 정렬(Quick Sort)의 전체적인 과정


 

그렇다면 퀵정렬에 대해 간단히 알아봤으니, 지금부터는 퀵 정렬이 수행되어지는 과정에 차근차근 알아보자.

 

 

 

4. 전체 코드


#include <iostream>

using namespace std;

void showArray(int* arr) {
	
	for (int i = 0; i < 10; i++) { cout << arr[i] << " "; }
	cout << endl;

}

int makePartition(int* arr, int start, int end) {
	
	int pivotIdx = arr[start];

	int count = 0;
	for (int i = start+1; i <= end; i++) {
		if (arr[i] < pivotIdx) {
			count++;
		}
	}
	pivotIdx = start + count;
	swap(arr[start], arr[pivotIdx]);

	int i = start, j = end;
	while (i < pivotIdx && j > pivotIdx) {
		while (arr[i] <= arr[pivotIdx]) { i++; } // Left subArray Traversal
		while (arr[j]  > arr[pivotIdx]) { j--; } // Right subArray Traversal
		
		if (i < pivotIdx && j > pivotIdx) {
			swap(arr[i], arr[j]);
		}
	}

	return pivotIdx;

}
void quickSort(int *arr, int start, int end){
	
	if (start >= end) {
		// if the length of Array is at most 1, exit the function
		return;
	}

	int pivotIdx = makePartition(arr, start, end);

	quickSort(arr, start, pivotIdx - 1);
	quickSort(arr, pivotIdx + 1, end);

}

int main() {

	int arr[10] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };
	const int length = 10;

	quickSort(arr, 0, length - 1);
	showArray(arr);

	return 0;

}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함