알고리즘

[Algorithm]쉘 정렬, 기수 정렬, 트리 정렬

zs1397 2022. 11. 25. 13:18

1. 쉘 정렬: 원소 비교 연산과 먼 거리의 이동을 줄이기 위해 서브리스트로 나누어 삽입 정렬을 반복 수행

2. 방법: 정렬에서 사용할 간격(interval) 결정  ->  첫번째 interval에 따라 서브리스트로 분할  -> 각 서브리스트에 대해 삽입 정렬 수행  ->  ... -> 리스트 전체에 대해 삽입 정렬 수행(마지막 interval = 1)

   - 시간 복잡도: O(n^1.25)

 ---------------- 그림 설명 ----------

3. ShellSort Algorithm

shellSort(a[])
	interval <- a.length;
    while(interval > 1) do{
    	interval <- 1+ interval/3;
        for(i<-0; i<interval; i<-i+1) do {
        	intervalSort(a, i, interval);
        }
    }

4. IntervalSort Algorithm

 intervalSort(a, i, interval)
 						// 서브리스트를 삽입 정렬하는 보조함수
 	j<-i+interval;
    while(j<a.length) do {
    	new <- a[j];	// 서브트리의 새로운 원소
        k <- j 			// new 보다 큰 원소는 interval만큼 오른쪽으로 이동, k는 왼쪽으로 이동
        move <- true;
        while(move) dp {
        	if(a[k-interval]<=new) then move <- false;
            else {
            	a[k] <- a[k-interval];
                k <- k - interval;	// k는 왼쪽으로 interval만큼 이동
                if(k=i) then move <- false;
            }
        }
        a[k] <- new;	// 이동해서 생긴 자리에 삽입
        j <- j + interval;	// 다음 서브리스트 원소의 인덱스
    }

1. 기수 정렬: 정렬할 원소의 키 값을 나타내는 숫자의 자리수를 기초로 정렬

2. 방법:

   - 첫번째 pass: 정렬할 키의 가장 작은 자리 수를 기준으로 분배 정렬

   - 두번째 pass: 2번째로 작은 자리 수를 기준으로 분배 정렬(키 값이 같을 때, 이전 정렬에서 순서 유지)

   - 가장 큰 자릿 수까지 반복 수행

   - 시간 복잡도: O(n)

   - RadixSort Algorithm

radixSort(a[])
	n <- a.length;
    for(k=1; k<=m; k++) do{  // m은 digit 수, k=1은 가장 작은 자리수
    	for(i=0; i<n; i++) do {
        	kd <= kth - digit(a[i];
            enqueue(Q[kd], a[i]);  // Q(kd)에 a[i]를 삽입
        }
        p <- -1;
        for(i=0; i<=9; i++) do {
        	while(Q[i]!=0) do{   // Q[i]의 모든 원소를 a[]로 이동
            	p <- p+1;
                a[p] <- dequeue(Q[i]);
            }
        }
    }

3. 알고리즘 실행 단계: 초기 리스트-> a=[35, 81, 12, 67, 93, 46, 23, 26]


1. 트리 정렬: 이진 정렬 트리 + 중위 우선 순회 

2. 방법:

   - 배열을 이진트리에 삽입: 동일 키 값의 원소 허용, 루트와 같은 키 값은 오른쪽 서브트리에 삽입

   - 중위 우선 순회 통해 원소 하나씩 검색 후 원래 배열에 저장

   - 시간 복잡도: O(nlogn)

   - TreeSort Algorithm

treeSort(a[], n)
	for(i=0; i<=n; i++)
    	insert(T,a[i]);  // T는 이진 정렬 트리
    inorder(T,a,-1);

   - Inorder Algorithm

inorder(T, a[], i)
	if(T=null) then return;
    inorder(T.left, a, i); // T의 왼쪽 서브트리
    i=i+1;
    a[i] <- T.key
    inorder(T.right, a, i); // T의 오른쪽 서브트리

3. 알고리즘 실행 단계

 

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

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