
버블 정렬 알고리즘
버블 정렬은 이웃한 두 요소의 대소 관계를 비교하여 교환을 반복하는 정렬 알고리즘이다.
자료들이 정렬되는 모습이 마치 보글보글 거품처럼 올라오는 모습이라 버블 정렬이라고 한다는데 잘 모르겠다..

이런식으로 붙어있는 요소들간의 비교를 해서 변경을 해야한다면 스왑을하고 그게 아니라면 비교만 하고 넘어간다.
코드로 한번 구현을 해보았다.
void bubble(int a[], int element)
{
for (int i = 0; i < element - 1; i++)
for (int j = 0; j < element - 1 - i; j++)
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
1. 매개변수로 비교할 배열과, 그 배열안의 요소가 몇개인지 받는다.
2. 첫번째 for문에서 요소의 수 -1 만큼 for문을 돈다. -1을 하는 이유는
(ex. {요소1,요소2,요소3,요소4} -> 요소1,요소2 / 요소2,요소3 / 요소3,요소4 )
이런식으로 4개의 요소가 있으면 3번만 비교를 하면 전부 비교가 끝나기 때문이다.
3. 두번째 for문은 요소의 수 -1 에서 i를 뺀만큼 for문을 도는데..
그 이유는 배열의 첫번째,끝 어디서 비교를 시작하더라도 비교와 교환을 통해 1자리는 확정이 나기 때문이다.
(ex. {6,3,2,1} -> 6,3 비교 6 이더 큼 (스왑) / 6,2 비교 6 이더 큼 (스왑), 마지막 6,1비교 6 이더 큼 (스왑))
이런식으로 6이라는 최대값의 자리는 확정이 났기때문에 굳이 비교를 또 할 필요가 없는것이다.
i가 돌때마다 한자리씩 자리가 확정이 나는것이기 때문에 i를 빼주어야한다.
실행 해보기
#include <stdio.h>
#include <stdlib.h>
void bubble(int a[], int element)
{
for (int i = 0; i < element - 1; i++)
for (int j = 0; j < element - i - 1; j++)
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
int main(void)
{
int count=0;
int* a;
printf("몇개의 요소를 정렬하실건가요?: ");
scanf_s("%d", &count);
a = calloc(count, sizeof(int));
puts("요소의 값들을 입력받습니다.\n");
for(int i=0;i<count;i++)
{
printf("a[%d]의 값을 입력해주세요: ",i);
scanf_s("%d", &a[i]);
}
puts("\n요소의 값들을 정렬합니다.\n");
bubble(a, count);
for (int j = 0; j < count; j++)
{
printf("a[%d]의 값은 : %d\n", j,a[j]);
}
free(a);
return 0;
}

이런식으로 위의 예시로 든 요소들의 정렬이 잘 된것을 볼 수 있다.
'프로그래밍 공부 > 자료구조&알고리즘 공부' 카테고리의 다른 글
셸 정렬(Shell Sort) (0) | 2022.07.19 |
---|---|
단순 선택 정렬 & 단순 삽입 정렬 (0) | 2022.07.18 |
재귀 알고리즘 / 순차곱셈 구하기, 유클리드 호제법 구현 (0) | 2022.07.16 |
[디자인 패턴] 옵저버 패턴(Observer Pattern) (0) | 2022.07.12 |
시간 복잡도와 함수 포인터 (0) | 2022.07.09 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!