본문 바로가기
Programando/Algorithm

정렬: 셸 정렬 알고리즘

Algorithm : 셸 정렬 알고리즘

: 단순 삽입 정렬의 장점은 살리고 단점을 보완하여 조금 더 빠르게 정렬하는 알고리즘으로, 정렬할 배열의 요소를 그룹으로 나눠 각 그룹 별로 단순 삽입 정렬을 수행하고, 그 그룹을 합치면서 정렬을 반복하여 요소의 이동 횟수를 줄이는 방법

 

단순 삽입 정렬 포스팅
 

정렬: 단순 삽입 정렬 알고리즘

Algorithm : 단순 삽입 정렬 알고리즘 : 선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 '삽입하는' 작업을 반복하여 정렬 1. 단순 삽입 정렬 알고리즘의 조건 j가 0보다 큽니다. array[j - 1] 값이 temp보

se0r1-tae27.tistory.com

 

1. 셸 정렬 알고리즘의 시간복잡도

: O(n1.25)

 

2. 셸 정렬 알고리즘 코드

출처 : 11399번: ATM (acmicpc.net)

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

import java.util.Scanner;

class ATM {
    
    static void shellSort(int[] array, int n) {
        
        int h;
        
        for(h = 1; h < n / 9; h = h * 3 + 1)
        ;
        // h값이 서로 배수가 되면 정렬 알고리즘이 동작하지 않기 때문에 수열을 사용
        // 1부터 시작하여 3배한 값에 1을 더하는 수열
        // h의 초깃값이 너무 크면 효과가 없기 때문에 배열의 요솟수 n을 9로 나눈 값을 넘지 않도록
        
        for( ; h > 0; h /= 3) {
            
            for(int i = h; i < n; i++) {
                
                int j;
                int temp = array[i];
                
                for(j = i - h; j >= 0 && array[j] > temp; j -= h)
                    array[j + h] = array[j];
                array[j + h] = temp;
            }
            
        }
        
        sumMin(array);
        
    }
    
    static void sumMin(int[] array) {
        
        int sum = 0;
        int allSum = 0;
        
        for(int i = 0; i < array.length; i++) {
            
            sum += array[i];
            allSum += sum;
            
            System.out.println(allSum);
            
        }
        
    }
    
}

public class Main
{
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		
		int n;
		
		n = stdIn.nextInt();
		int[] sorting = new int[n];
		
		for(int i = 0; i < n; i++) {
		    
		    sorting[i] = stdIn.nextInt();
		    
		}
		
		ATM atm = new ATM();
		atm.shellSort(sorting, n);
	}
}
반응형