본문 바로가기

CodingTest Exam/[C++] Algorithm Study

34. 버블정렬 (it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비) ★☆☆☆☆

#include <stdio.h>
#include <vector>

using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	
	vector<int> num(n, 0);
	
	for(int i = 0; i < num.size(); i++)
		scanf("%d", &num[i]);
	
	int temp = 0;
	for(int i = 0; i < n-1; i++)
	{
		for(int j = 0; j < n-i-1; j++)
		{
			if(num[j] > num[j+1])
			{
				temp = num[j];
				num[j] = num[j+1];
				num[j+1] = temp;
			}
		}
	}
	
	for(int i = 0; i < n; i++)
		printf("%d ", num[i]);
	return 0;
}

1. 버블정렬이란? : 맨 왼쪽 수부터 이웃한 숫자와 비교하면서 큰 숫자를 맨 오른쪽으로 보내는 정렬방식이다. 마치 수면아래에서 버블이 수면 위로 떠 올라가는 형상처럼 보여서 버블정렬이라고 한다. 정렬을 할 때마다 비교횟수가 줄어든다. 다음 예시로 알아보자.

 

 

1) i = 0;

j = 0 ~ 4

 

      j = 0  ↓ 

13 23 11 7 5 15

if ( num[j] > num[j+1] ) = if ( 13 > 23 ) == false

j++

 

                                      j = 1  ↓

13 23 11 7 5 15

if (num[j] > num[j+1] ) = if ( 23 > 11 ) == true

true가 되면 스왑을 진행한다.

temp = num[1] = 23;

num[1] = num[2] / 23을 11로 변경;

num[2] = temp / 11을 23으로 변경;

 

                                                                       j = 2  ↓

13 11 23 7 5 15

if (num[j] > num[j+1] ) = if ( 23 > 7 ) == true

true가 되면 스왑을 진행한다.

temp = num[2] = 23;

num[2] = num[3] / 23을 7로 변경;

num[2] = temp / 7을 23으로 변경;

 

이후 반복 ( num[n-i-1] = num[6-0-1] = num[5] 전 까지 실행한다. 15 이후로는 수가 없기 때문)


       j = 0  ↓

13 11 7 5 15 23

위 과정을 num[n-i-1] = num[6-1-1] = num[4] 전 까지 반복한다. 가장 큰 숫자 23이 맨 오른쪽으로 갔으므로 23까지 비교할 필요가 없기 때문

 

 

이후 반복하면 결과는 아래와 같이 된다.

5 7 11 13 15 23