알고리즘

[Algorithm] 퀵 정렬

zs1397 2022. 11. 22. 22:35

1. 퀵 정렬: 분할 정복(divide and conquer) 정렬 방법 중 하나

  - 방법: 배열 a[m:n]의 한 원소를 pivot으로 선정 -> pivot 기준으로 두개의 파티션으로 분할(왼쪽: 작은 값 원소들, 오른쪽: 큰 값의 원소들) 

  - 시간 복잡도: O(nlogn)

  -  QuickSort Algorithm

quickSort(a[], m, n)
				// 배열 a의 부분 배열 a[m:n]을 오름차순 정렬
	if(m>=n) then return; // 정렬 원소 수가 0이거나 1일때는 복귀
    p = partition(a,m,n)  // p는 파티션이 끝난 뒤 사용된 pivot 인덱스
    quickSort(a[], m, p-1);
    quickSort(a[], p+1, n);

 ※ patition 알고리즘: 부분 배열 a[i:j]의 중앙 원소를 pivot 값을 정하고 왼쪽과 오른쪽 파티션으로 분할함

   - 과정:

 a[i: j]의 중앙 mid 인덱스 선정해 x를 분할 기준 값 pivot으로 정한다. (pivot = x)

 -> a[mid]의 원소 x와 a[]의 제일 왼쪽인 a[i] 원소인 y를 서로 교환

   - partition 알고리즘 

partition(a[], i, j)
	mid <- (i,j)/2;  // a[]의 중앙 인덱스
    pivot <- a[mid]; // a[]의 중앙 원소 값을 pivot으로 설정
    a[mid] <- a[i];  // a[i]와 a[mid]를 서로 교환
    a[i] <- pivot;   // a[i]는 pivot 값을 보관
    p <- i;			 // p는 두 파티션 경계 지시하는 인덱스
    for(k<-i+1; k<=j; k<-k+1) do {
    				// a[i]를 제외한 a[i+1: j]에 있는 모든 원소 a[k]를 검사
    	if(a[k]<pivot) then{
        	p <- p+1;		// p를 +1한 뒤 a[k]를 p인덱스 범위 안으로 포함되게 함
            temp <- a[p];
            a[p] <- a[k];
            a[k] <- temp;
        }
    }
    temp <- a[i];	// a[i]와 a[p]를 교환
    a[i] <- a[p];
    a[p] <- temp;
    return p;

2. 퀵 정렬 수행 과정

  - a = [3 1 4 5 9 8 7], 초기 배열 a[i: j], i=0, j=6일때

     ---- ----- 그림 정리 -----

'알고리즘' 카테고리의 다른 글

[Algorithm]쉘 정렬, 기수 정렬, 트리 정렬  (0) 2022.11.25
[Algorithm] 히프 정렬  (0) 2022.11.22
[Algorithm] 위상순서, 임계경로  (0) 2022.11.02
[Algorithm] MCSP_최단거리  (0) 2022.10.26
알고리즘 시험공부) 힙  (0) 2022.10.17