버블정렬 (C언어)
#include <stdio.h>
void main(){
int i,j;
int temp;
int a[5] = {75,95,85,100,50};
for(i=0; i<4; i++){
for(j=0; j<4-i; j++){
if(a[j] > a[j+1]){
temp=a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(i=0; i<5; i++){
printf("%d", a[i]);
}
}
해당 코드는 2020년 1회 정보처리 기사 문제인데
알고리즘 버블정렬을 통하여 각 배열의 크기를 비교하여 위치를 변경하여 낮은 숫자 -> 높은 숫자로 변경한다.
일단 담고 있는 배열 a 와 각각 배열을 비교하기 위한 변수 temp 가 필요하다.
여기서 temp는 값을 임시로 저장하여 기존 값이 덮어써지는 것을 방지하기 위한 변수이다.
for(i=0; i<4; i++){
for(j=0; j<4-i; j++){
if(a[j] > a[j+1]){
temp=a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
일단 해당 코드가 버블정렬에 알고리즘인데 애초에 배열갯수가 5개이기때문에
어차피 앞뒤로 비교하기 때문에 해당 값의 앞의 값과 +1 된 뒤의 값이 필요하기에 n-1로 인해 i는 0,1,2,3 만 돌려주기로 한다.
현재 배열은 a[5] = {75, 95, 85, 100, 50}
i= 0 일때는
j = 0 부터 시작하여 j < 4-i 이기 때문에 0,1,2,3 까지 돌려준다
j = 0 => 75 95 인데
if(a[j] > a[j+1])
해당 if 문 때문에 값 비교에서 75 > 95 가 불가능하니 넘겨준다.
j = 1 일때는 가능 => temp a[1]의 값인 95 복사해서 저장해두고
temp=a[j];
a[1] = a[2] 로 인해 a의 값이 95 => 85 교체
a[j] = a[j+1];
그리고 해당 temp에 있는 값을 a[2]에 다시 넣어둔다. (temp는 이런 경우 이용되기 때문에 변수를 선언함)
a[j+1] = temp;
그럼 현재 배열은 {75 85 95 100 50} => 85와 95가 자리 변경
이런식으로 반복하면 된다.
그러면 i = 0 을 다 돌렸을때 현 배열 {75 85 95 50 100}
i = 1 일경우 j는 0,1,2 를 돌리는데
j = 0 은 안됨
j = 1 은 안됨
j = 2 됨 temp 95 복사 후 a[2] = a[3], a[2]에 50 복사 후 a[3]에 95 기입
변경된 배열 {75 85 50 95 100}
... 이런식으로 변경하다보면
for(i=0; i<5; i++){
printf("%d", a[i]);
}
현 배열은 a[5] = {50 75 85 95 100}
for 문으로 0~4 까지 돌리면 %d로 인해 뭐 띄워쓰기 그런거 필요없이 그냥 값만 다닥 붙여서 출력한다.
정답 : 50758595100
알게 된점 : 버블정렬은 인접한 두 값을 비교하며 큰 값을 뒤로 보내는 과정을 반복하여 정렬하는 알고리즘이다.