본문 바로가기
알고리즘/자료구조(C)

버블 정렬(Bubble Sort)

by 진진리 2023. 9. 22.
728x90
  • 버블 정렬(Bubble sort)

서로 인접한 두 원소를 비교하여 정렬되어 있지 않은 경우에 교환하는 정렬 알고리즘

*일련의 비교 과정을 패스(pass)라고 함

비교 횟수: (n-1) + (n-2) + ... + 1 = n(n-1)/2 이므로 시간복잡도 O(n^2) (best, avg, worst 모두)

 

#include <stdio.h>
#include <stdlib.h>
#define swap(x, y) do {int t = x; x = y; y = t;} while(0)

void bubble(int a[], int n) {
	int i, j;
	for (i = n-1; i > 0; i--) {
		for (j = 0; j < i; j++) {
			if (a[j] > a[j + 1]) swap(a[j], a[j + 1]);
		}
	}
}

int main(void) {
	int i, nx;
	int* x; //배열 첫 요소 포인터

	puts("버블 정렬");
	printf("요소 개수: ");
	scanf_s("%d", &nx);
	x = calloc(nx, sizeof(int));

	for (i = 0; i < nx; i++) {
		printf("x[%d]: ", i);
		scanf_s("%d", &x[i]);
	}

	bubble(x, nx);

	puts("오름차순으로 정렬했습니다.");
	for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]);

	free(x);

	return 0;
}

 

  • 개선된 알고리즘

어떤 패스에서 요소의 교환 횟수가 0이면 정렬을 마칠 수 있음

 

void bubble(int a[], int n) {
	int i, j;
	for (i = n-1; i > 0; i--) {
		int exchg = 0; // 교환 횟수
		for (j = 0; j < i; j++) {
			if (a[j] > a[j + 1]) {
				swap(a[j], a[j + 1]);
				exchg++;
			} 
		}
		if (exchg == 0) break;
	}
}

 

 

'알고리즘 > 자료구조(C)' 카테고리의 다른 글

삽입 정렬(Insertion Sort)  (0) 2023.09.22
선택 정렬(Selection Sort)  (0) 2023.09.22
재귀 알고리즘  (0) 2023.09.22
  (0) 2023.09.22
스택  (0) 2023.09.22