본문 바로가기
CS/Algorithm

퀵 정렬 (Quick Sort)

by seoyamin 2022. 5. 9.

1. 퀵 정렬

▶ 분할정복 알고리즘

input 배열을 반복적으로 분할해서 계산하는 알고리즘이며,  평균 시간복잡도가 O(N*logN) 

특정한 값 a을 기준으로 a보다 큰 수, a보다 작은 수를 나누자 !

 

※ 특정한 값 a = pivot

※ 일반적으로 첫번째 원소를 pivot 값으로 설정한다.

 

 

 

2. 퀵 정렬 예제

ex )  3  7  8  1  5  9  6  10  2  4  오름차순 정리하시오.

 

#include <stdio.h>

int number = 10;
int data[10] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };

void show() {
	for (int i = 0; i < number; i++) {
		printf("%d ", data[i]);
	}
}

void quickSort(int* a, int start, int end) {
	int temp;
	if (start >= end) {        // 원소가 1개인 경우
		return;
	}
	
	int key = start;        // key = pivot = 1st 원소
	int i = start + 1;      // (왼쪽 출발 지점 index) 탐색 시작하는 key 바로 다음 원소 index 
	int j = end;            // (오른쪽 출발 지점 index)

	while (i <= j) {   //  #엇갈릴 때까지 반복 

		// [왼쪽 출발] : key 값보다 큰 값을 만날 때까지 오른쪽으로 이동
		while (a[i] <= a[key]) {                 
			i++;
		}

		// [오른쪽 출발] : key 값보다 작은 값을 만날 때까지 왼쪽으로 이동
		while (a[j] >= a[key] && j > start) {    
			j--;
		}

		if (i > j) {  // 엇갈리게 된 상태라면 key값과 작은 값 a[j] 교체 후 #while문 빠져나옴
			temp = a[j];
			a[j] = a[key];
			a[key] = temp;
		}

		else {        // 엇갈리지 않았다면 a[i]와 a[j] 위치 change 후 #while문 반복
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}

	}  

	quickSort(a, start, j - 1);
	quickSort(a, j + 1, end);
}

int main(void) {
	quickSort(data, 0, number - 1);
	show();

	return 0;
}

 

 

 

3. 퀵 정렬의 시간 복잡도

1 2 3 4 5 6 7 8 9 10 을 정렬하려 할 때,

 

▷▷ 선택정렬 등 :  N ^ 2 = 10 * 10 = 100

▶▶ 퀵정렬 :  1 2 3 4 5   /   6 7 8 9 10 으로 나누어서 정렬

                     2 * (5 * 5) = 2 * 25 = 50

 

∴  input이 N개일 때, 퀵 정렬의 시간복잡도는 O(N * logN) 

 

 

'CS > Algorithm' 카테고리의 다른 글

기수 정렬 (Radix Sort)  (0) 2022.06.11
쉘 정렬 (Shell Sort)  (0) 2022.06.06
삽입 정렬 (Insertion Sort)  (0) 2022.05.06
버블 정렬 (Bubble Sort)  (0) 2022.05.04
선택 정렬 (Selection Sort)  (0) 2022.05.03