Developer Cafe

빅 오 표기법 2. 버블 정렬 본문

자료 구조/누구나 자료 구조와 알고리즘

빅 오 표기법 2. 버블 정렬

개발자 카페 2021. 3. 5. 01:26
728x90

정렬 알고리즘 중 기본인 버블 정렬의 사용법

 

1. 배열 내에서 연속된 두 항목을 가르킨다.

2 1 3 5

2. 두 항목의 순서가 바뀌었으면(왼쪽값이 오른쪽값보다 크면) 항목을 바꾼다

1 2 3 5

3. 포인터를 한칸 이동하여 반복한다.

1 2 3 5

 

1 ~3 을 반복하는 것을 패스스루 라고 한다.

패스스루가 끝나면 마지막 원소 즉, 5를 빼고 다시 패스스루를 반복한다.

(총 행의 수 - 1 ) 의 패스스루를 반복한다. 위의 예시에선 3번의 패스스루가 일어난다.

위에 예시에선 결국 (N-1) + (N-2)...+ 1번의 비교를 수행한다. 위의 예시에선 3+2+1=6번의 비교가 일어난다.

여기에 더해 만약 모든 수가 역순일경우엔 총 6번의 교환이 더 일어나게 된다. 총 12단계의 작업이 일어난다.

 

원소 N개 최대 단계 수 버블 정렬의 단계 수 N^2(버블 정렬의 비효율성)
4 12 12 16
5 20 20 25
10 90 90 100
20 380 380 400
40 1560 1560 1600
80 6320 6320 6400

※ N^2를 이차 시간 이라고도 부른다.

 

function hasDuplicateValue(array) {
	var steps = 0;
	for(var i = 0 ; i < array.length ; i++ ){
    	for(var j = 0 ; j < array.length ; j++ ){
        	steps++;
        	if(i !== j && array[i] == array[j]) {
            	return true;
            }
        }
    }
    console.log(steps);
    return false;
}

배열 중복 값이 있는지 확인하는 자바스크립트다. 위의 코드가 잘 동작하겠지만 너무나도 비효율적인다.

hasDuplicateValue([1, 2, 3])으로 실행하면 콘솔엔 9가 찍힌다.

 

 

function hasDuplicateValue(array) {
	var steps = 0;
	var existingNumbers = [];
    for(var i = 0 ; i < array.length ; i++ ){
    	steps++;
    	if(existingNumbers[array[i]] === undefined) {
        	existingNumbers[array[i]] = 1;
        } else {
        	return true;
        }
    }
    console.log(steps);
    return false;
}

다음은 코드단계 수를 좀더 최적화 한 것이다.

existingNumbers엔 배열을 기록해둔것이다.

[3, 5, 8]을 넣어 돌리면 [undefined, undefined, undefined, 1, undefined, 1, undefined, undefined, 1]가 나온다.

즉 array엔 3, 5, 8이 있다는 뜻이 된다. 콘솔엔 3이 찍히며 결국 O(N)이라는 결론이 나온다.

위의 코드 O(N^2)보다 아래 코드 O(N)가 훨씬 빠르고 효율적이다.

 

728x90
Comments