Algorithm/Base

Quick Sort 퀵 정렬 (C++)

_cpdm_ 2022. 9. 1. 15:46
반응형

Quick Sort 퀵 정렬 (C++)


Counting Sort란?

기준 데이터(Pivot)을 설정하고 그 기준 보다 큰 데이터와 작은 데이터의 위치를 바꾸어가며 정렬하는 알고리즘

분할 정복 기법을 활용한다

불안정 정렬

순서

1. 피봇의 위치를 설정한다.

2. 분할 : 피봇을 토대로 데이터를 정렬해나간다. 정렬이 끝나면 피봇의 앞은 피봇보다 작은 값들이,
    피봇의 뒤는 피봇보다 큰 값들이 오게된다. 

3. 2의 과정으로 쪼개진 영역에 대해 재귀적으로 다시 정렬을 수행한다.

이를 애니메이션으로 나타내면 다음과 같다.

시간복잡도

평균 시간 복잡도 : O(NlogN)

이미 정렬이 되어있는 상태일 때 최악의 경우가 되며, 이 때의 시간 복잡도는 O(N^2)

Code

#include<iostream>
using namespace std;

void swap(int arr[], int a, int b) {
	int tmp = arr[a];
	arr[a] = arr[b];
	arr[b] = tmp;
}

void quick_sort(int arr[], int start, int end) {
	// 원소가 1개인 경우 종료
	if (start >= end) return;
	// pivot은 start위치로 잡는다.
	int pivot = start;
	int L = start + 1;
	int R = end;
	// 분할 과정을 수행한다.
	while (L <= R) {
		// 피봇보다 큰 데이터를 왼쪽에서부터 찾는다.
		while (L <= end && arr[L] <= arr[pivot]) ++L;
		// 피봇보다 작은 데이터를 찾는다
		while (R > start && arr[R] >= arr[pivot]) --R;
		// 엇갈렸다면 피봇 교체
		if (L > R) swap(arr, R, pivot);
		else swap(arr, L, R); // L, R 데이터 교체
	}
	// 분할 과정이 끝나면 나누어진 부분에 대해서 재귀적으로 다시 수행
	quick_sort(arr, start, R - 1);
	quick_sort(arr, R + 1, end);
}


int main(void) {
	int arr[10] = { 2,6,8,1,4,9,5,3,7,10 };
	int N = 10;
	quick_sort(arr, 0, N-1);
	cout << "정렬 후 : ";
	for (int i = 0; i < N; ++i) {
		cout << arr[i] << ' ';
	}
	cout << endl;
	return 0;
}

 

 

cpdm

 

choppadontbiteme.tistory.com

 

반응형