본문 바로가기
알고리즘/자료구조(C)

퀵 정렬(Quick Sort)

by 진진리 2023. 9. 22.
728x90
  • 퀵 정렬(Quick Sort)

기준이 되는 피벗(pivot)을 기준으로 배열을 두 그룹으로 나눈 후 피벗을 기준으로 더 작은 값은 왼쪽으로, 큰 값은 오른쪽을 옮김.

 

1. 한 배열의 왼쪽 끝 요소의 인덱스를 pl, 오른쪽 끝 요소의 인덱스를 pr이라고 할 때

2. a[pl] >= x인 pl과 a[pr] <= x인 pr을 찾아 두 값을 교환 (x = a[pivot])

3. pl과 pr이 교차하게 되면 나눠진 두 그룹에 대하여 각각 위의 과정을 반복

 

void quick(int a[], int left, int right) {
	int pl = left;
	int pr = right;
	int x = a[(pl + pr) / 2];
	do {
		while (a[pl] < x) pl++;
		while (a[pr] > x) pr--;
		if (pl <= pr) {
			swap(a[pl], a[pr]);
			pl++;
			pr--;
		}
	} while (pl <= pr);
	if (left < pr) quick(a, left, pr);
	if (pl < right) quick(a, pl, right);
}

 

시간복잡도:O(n log n) - best, avg (worst는 O(n^2))


<stdlib.h>의 qsort() 함수 이용

int int_cmp(const int *a, const int* b){
    if(*a < *b) return -1;
    else if(*a > *b) return 1;
    else return 0;
}

...

qsort(배열, 배열개수, sizeof(요소자료형), int_cmp);

 

구조체의 문자열을 기준으로 배열하고자 할 때 compare 함수 예시

int npcmp (const Person* x const Person* y){
    return strcmp(x->name, y->name);
}

 

'알고리즘 > 자료구조(C)' 카테고리의 다른 글

힙 정렬(Heap Sort)  (0) 2023.09.22
병합 정렬(Merge Sort)  (0) 2023.09.22
삽입 정렬(Insertion Sort)  (0) 2023.09.22
선택 정렬(Selection Sort)  (0) 2023.09.22
버블 정렬(Bubble Sort)  (0) 2023.09.22