공부/C & C++

[C언어] 버블 정렬

미친사람 2021. 12. 30. 22:23
반응형

버블 정렬(Bubble Sort) 알고리즘 이란

 


#include <stdio.h>
/*
	버블 정렬 (오름 차순) 1 2 3 ->
	7 4 5 1 3	:: 기본 
	4 5 1 3 7	:: 1회 
	4 1 3 5 7	:: 2회 
	1 3 4 5 7	:: 3회 
	1 3 4 5 7	:: 4회 
	
	특징 1 : 버블 정렬을 1회 시도하면 배열에서 가장 큰 수 하나가 오른쪽으로 무조건 지정
	특징 2 : 버블 정렬을 [n - 1] 회 시도하면 오름 차순으로 정렬이 완료 된다. 
*/


// 기존 값이 비교 값보다 크다면, 기존 값을 빈 값에 넣어두고 
// 기존 값에 비교 값을 넣고 비교 값에 기존 값을 넣는다. 
void BubbleSort(int arr[], int n) {
	int i, j, k;
	int temp;
	
	for(i = 0; i < n - 1; i++) {
		printf("[%d 번] ", i);
		
		for(j = 0; j < n; j++) {
			printf("%d ", arr[j]);
		}
		
		printf("\n");
		
		// 뒤에 있는 인덱스 번호는 어차피 큰 값으로 있는 값이므로 계산을 안해도 된다.
		// 그래서 n - j - 1 형식으로 만들어준다. 
		for(k = 0; k < (n-i-1); k++) {
			if(arr[k] > arr[k + 1]) {
				temp = arr[k];
				arr[k] = arr[k + 1];
				arr[k + 1] = temp;
			}
		}
	}
}

int main(void) {	

	
	int arr[5] = {7, 4, 5, 1, 3};
	
	BubbleSort(arr, sizeof(arr)/sizeof(int));
	
	int i;
	
	printf("\n[버블 정렬] ");
	for(i = 0; i < 5; i++) {
		printf("%d ", arr[i]);
	}
	
	
	return 0;
}

 

 


버블 정렬(Bubble Sort) 알고리즘의 특징

 

장점

  • 구현이 매우 간단하다.

단점

  • 순서에 맞지 않은 요소를 인접한 요소와 교환한다.
  • 하나의 요소가 가장 왼쪽에서 가장 오른쪽으로 이동하기 위해서는 배열에서 모든 다른 요소들과 교환되어야 한다.
  • 특히 특정 요소가 최종 정렬 위치에 이미 있는 경우라도 교환되는 일이 일어난다.

일반적으로 자료의 교환 작업(SWAP)이 자료의 이동 작업(MOVE)보다 더 복잡하기 때문에 버블 정렬은 단순성에도 불구하고 거의 쓰이지 않는다.

 

버블 정렬(Bubble Sort)의 시간복잡도

 

비교 횟수

  • 최상, 평균, 최악 모두 일정
  • n-1, n-2, … , 2, 1 번 = n(n-1)/2


교환 횟수

  • 입력 자료가 역순으로 정렬되어 있는 최악의 경우, 한 번 교환하기 위하여 3번의 이동(SWAP 함수의 작업)이 필요하므로 (비교 횟수 * 3) 번 = 3n(n-1)/2
  • 입력 자료가 이미 정렬되어 있는 최상의 경우, 자료의 이동이 발생하지 않는다.


T(n) = O(n^2)

단순(구현 간단)하지만 비효율적인 방법

  • 삽입 정렬, 선택 정렬, 버블 정렬

복잡하지만 효율적인 방법

  • 퀵 정렬, 힙 정렬, 합병 정렬, 기수 정렬

 

- 내용 출처

https://gmlwjd9405.github.io/2018/05/06/algorithm-bubble-sort.html

반응형