알고리즘 & 자료구조/알고리즘

[알고리즘] 버블 정렬

인디아나쥰이 2021. 1. 19. 14:16

버블 정렬

버블 정렬은 두 개의 인접한 자료 값을 비교하면서 위치를 교환하는 방식으로 정렬하는 방법이다.

버블 정렬은 단 두 개의  요소만 정렬해주는 좁은 범위의 정렬에 집중한다.

접근법 자체는 간단하지만, 단 하나의 요소를 정렬하기 위해 너무 많은 교환이 발생할 수 있다.

 

 

 


예를 들어 

 

6 3 8 5 2 7 4 1 

 

이라는 숫자를 오름차순으로 정렬한다고 가정해보자.

 

우선 가장앞의 6 과 3을 비교해서 순서를 바꾼다.

 

3 6 8 5 2 7 4 1 

 

이제 6 과 8을 비교해보면 교환할 필요가 없으므로 그대로 두고

바로 다음에 있는 쌓인 8과 5를 비교해서 순서를 바꾼다.

 

3 6 5 8 2 7 4 1

 

이런식으로 끝까지 진행한다면

 

3 6 5 2 7 4 1 8 

 

위와 같이 정렬된다.

 

 

하지만 아직 오름차순으로 정렬이 되지 않았기 때문에, 다시 처음부터 동일한 작업을 반복한다.

 

이 과정을 반복하다보면 최종적으로는 아래와 같이 오름차순 정렬이 된다.

 

1 2 3 4 5 6 7 8

 

이러한 방식을 버블정렬이라고 한다.

 

한번 수행 할 때 마다 맨 뒤의 숫자는 정렬된다는 특징이 있다.

고로 수행시 마다 수행해야 할 인덱스가 1개 씩 줄어든다.

 

#include <stdio.h>

#define SIZE 8

int main()
{
    int temp;
    
    int arr[SIZE] = {6,3,8,5,2,7,4,1}; 


    
    for(int i = 0; i < SIZE -1; i++) //(n-1)...(n-2)..(n-3)..이런 식으로 전체를 정렬해야 하는 횟수가 줄어듬
    {                          //   왜냐. 한번 정렬시에 마지막 숫자 8은 이미 정렬 되어있음
        for(int j = 0; j < (SIZE-1) - i; j++){ //인덱스 번호 비교를 위한 반복문
            if(arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }



    for(int i = 0; i < 8; i++)
    {
        printf("%d ", arr[i]);
        
    }
    
    return 0;
}
#include <stdio.h>

int main(void)
{
    int i, j , temp;
    int array[10] = {1,10,5,8,7,6,4,3,2,9};
    for(i = 0; i < 10; i++)
    {
        for(j = 0; j < 9-i; j++)
        {
            if(array[j] > array[j+1])
            {
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        } 
    }

    for(i = 0; i < 10; i++)
    {
        printf("%d ", array[i]);
    }
    return 0;
}

 

 

이러한 버블 정렬의 Big O 는 선택정렬과 마찬가지로 등차수열에 따라서 

O(N^2) 가 된다.

 

 

 

 

 

728x90
반응형