ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๋ฒ„๋ธ” ์ •๋ ฌ Bubble Sort

NaNaRin๐Ÿ™ƒ 2021. 1. 24. 14:36

๋ฒ„๋ธ” ์ •๋ ฌ (Bubble Sort) ์•Œ๊ณ ๋ฆฌ์ฆ˜ : 

์„œ๋กœ ์ด์›ƒํ•œ ๋‘ ์š”์†Œ์˜ ๋Œ€์†Œ ๊ด€๊ณ„๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ตํ™˜์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์š”์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ n๊ฐœ์ธ ๋ฐฐ์—ด์€ ์ด n-1ํšŒ์˜ ํŒจ์Šค๋ฅผ ๊ฑฐ์น˜๋ฉฐ, i๋ฒˆ์งธ ํŒจ์Šค์—์„œ ๊ฐ๊ฐ n-i๋ฒˆ์˜ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค

( ํŒจ์Šค์˜ ํšŸ์ˆ˜๊ฐ€ n-1ํšŒ์ธ ์ด์œ ๋Š” n-1ํšŒ์˜ ์ •๋ ฌ์ด ๋๋‚˜๋ฉด ๋งˆ์ง€๋ง‰ ์š”์†Œ ํ•˜๋‚˜๊ฐ€ ๋‚จ๋Š”๋ฐ, ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ )

 

int[] bubble = {6, 4, 5, 1, 2}

1. ์ฒซ๋ฒˆ์งธ ํŒจ์Šค : bubble[0] ~ bubble[4] ์ค‘ ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค๋กœ ์ด๋™

   1-1. bubble[0]๊ณผ bubble[1]์„ ๋น„๊ต, bubble[0]์ด bubble[1]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {4, 6, 5, 1, 2}

   1-2. bubble[1]๊ณผ bubble[2]์„ ๋น„๊ต, bubble[1]์ด bubble[2]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {4, 5, 6, 1, 2}

   1-3. bubble[2]๊ณผ bubble[3]์„ ๋น„๊ต, bubble[2]์ด bubble[3]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {4, 5, 1, 6, 2}

   1-4. bubble[3]๊ณผ bubble[4]์„ ๋น„๊ต, bubble[3]์ด bubble[4]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {4, 5, 1, 2, 6}

2. ๋‘๋ฒˆ์งธ ํŒจ์Šค : bubble[0] ~ bubble[3] ์ค‘ ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค๋กœ ์ด๋™

   2-1. bubble[0]๊ณผ bubble[1]์„ ๋น„๊ต, bubble[0]์ด bubble[1]๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ๊ตํ™˜X {4, 5, 1, 2, 6}

   2-2. bubble[1]๊ณผ bubble[2]์„ ๋น„๊ต, bubble[1]์ด bubble[2]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {4, 1, 5, 2, 6}

   2-3. bubble[2]๊ณผ bubble[3]์„ ๋น„๊ต, bubble[2]์ด bubble[3]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {4, 1, 2, 5, 6}

 

 

๋ฐฐ์—ด bubble์˜ ๋ฒ„๋ธ” ์ •๋ ฌ ๊ณผ์ • - 1

 

3. ์„ธ๋ฒˆ์งธ ํŒจ์Šค : bubble[0] ~ bubble[2] ์ค‘ ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค๋กœ ์ด๋™

   3-1. bubble[0]๊ณผ bubble[1]์„ ๋น„๊ต, bubble[0]์ด bubble[1]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {1, 4, 2, 5, 6}

   3-2. bubble[1]๊ณผ bubble[2]์„ ๋น„๊ต, bubble[1]์ด bubble[2]๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ตํ™˜ {1, 2, 4, 5, 6}

4. ๋„ค๋ฒˆ์งธ ํŒจ์Šค : bubble[0] ~ bubble[1] ์ค‘ ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค๋กœ ์ด๋™

   3-1. bubble[0]๊ณผ bubble[1]์„ ๋น„๊ต, bubble[0]์ด bubble[1]๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ๊ตํ™˜X {1, 2, 4, 5, 6}

 

๋ฐฐ์—ด bubble์˜ ๋ฒ„๋ธ” ์ •๋ ฌ ๊ณผ์ • - 2

 

์ฒซ๋ฒˆ์งธ ํŒจ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๋‘๋ฒˆ์งธ ํŒจ์Šค๋Š” ๋งจ ๋์˜ ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ง„ํ–‰๋˜๊ณ ,

๋‘๋ฒˆ์งธ ํŒจ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‘๋ฒˆ์งธ๋กœ ํฐ ์š”์†Œ๊ฐ€ ๋งจ ๋’ค์—์„œ ๋‘๋ฒˆ์งธ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์„ธ๋ฒˆ์งธ ํŒจ์Šค๋Š” ๋งจ ๋์˜ ๋‘ ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ง„ํ–‰๋œ๋‹ค.

=> ํŒจ์Šค๊ฐ€ ํ•œ๋ฒˆ์”ฉ ์ง„ํ–‰๋  ๋•Œ ๋งˆ๋‹ค ์ •๋ ฌ์—์„œ ์ œ์™ธ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋Š˜์–ด๋‚œ๋‹ค.

 

 

๋ฉ”์„œ๋“œ swap() : a[idx1] ๊ณผ a[idx2] ๋ฅผ ๊ตํ™˜

๋งค๊ฐœ๋ณ€์ˆ˜ : int[] a, int idx1, int idx2

 

๋ฉ”์„œ๋“œ bubbleSort() : ๊ธธ์ด๊ฐ€ n์ธ ๋ฐฐ์—ด a๋ฅผ ๋ฒ„๋ธ” ์ •๋ ฌ

๋งค๊ฐœ๋ณ€์ˆ˜ : int[] a, int n

 

- ๋ฒ„๋ธ” ์ •๋ ฌ (1) : ์ค‘๊ฐ„์— ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ ์ƒํƒœ๊ฐ€ ๋˜์–ด๋„ ๋๊นŒ์ง€ ๋น„๊ต ์ˆ˜ํ–‰

void swap(int[] a, int idx1, int idx2) {
	int t = a[idx1];
	a[idx1] = a[idx2];
	a[idx2] = t;
}

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

 

- ๋ฒ„๋ธ” ์ •๋ ฌ (2) : ์ค‘๊ฐ„์— ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋”์ด์ƒ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ

 

๋‘๋ฒˆ์งธ ํŒจ์Šค์˜ ๊ตํ™˜ ํšŸ์ˆ˜๊ฐ€ 0์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ธ๋ฒˆ์งธ ํŒจ์Šค ์—†์ด ์ข…๋ฃŒ

   ( ํ•œ ํŒจ์Šค์—์„œ ๊ตํ™˜ ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฉด ๋” ์ด์ƒ ์ •๋ ฌ ํ•  ์š”์†Œ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜ exchg ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ตํ™˜์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  ๊ตํ™˜ ํšŸ์ˆ˜๊ฐ€ 0์ด๋ฉด ์ข…๋ฃŒ )

void swap(int[] a, int idx1, int idx2) {
	int t = a[idx1];
	a[idx1] = a[idx2];
	a[idx2] = t;
}

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

 

- ๋ฒ„๋ธ” ์ •๋ ฌ (3) : ํ•œ ํŒจ์Šค ์•ˆ์—์„œ ์ค‘๊ฐ„์— ์ •๋ ฌ์ด ๋” ์ด์ƒ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ํŒจ์Šค์—์„œ ์ •๋ ฌ์ด ์ผ์–ด๋‚œ ๋ถ€๋ถ„๊นŒ์ง€๋งŒ ์ •๋ ฌ

 

์ฒซ๋ฒˆ์งธ ํŒจ์Šค์—์„œ a[1] ์ดํ›„์— ์ •๋ ฌ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘๋ฒˆ์งธ ํŒจ์Šค์—์„œ a[0] ๊นŒ์ง€๋งŒ ์ •๋ ฌ 

   ( ํ•œ ํŒจ์Šค ์•ˆ์—์„œ ์ค‘๊ฐ„ a[j] ์ดํ›„์— ์ •๋ ฌ์ด ๋” ์ด์ƒ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉด a[j+1] ์ดํ›„๋Š” ๋” ์ด์ƒ ์ •๋ฆฌํ•  ์š”์†Œ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜ last ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ j๋ฅผ ์ €์žฅ, ๋‹ค์Œ ํŒจ์Šค์—์„œ j-1 ๊นŒ์ง€๋งŒ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. )

void swap(int[] a, int idx1, int idx2) {
	int t = a[idx1];
	a[idx1] = a[idx2];
	a[idx2] = t;
}

void bubbleSort(int[] a, int n) {
	int k = n - 1;
	while(k > 0) {
		int last = 0;
		for(int j = 0; j < k; j++) {
			if(a[j] > a[j+1]) {
				swap(a, j, j+1);
				last = j;
			}
		}
		k = last;
	}
}

 

 

 

 

 ๋ฒ„๋ธ” ์ •๋ ฌ Bubble Sort :

์ตœ์„  = ํ‰๊ท  = ์ตœ์•… = O(N^2)

์•ˆ์ •ํ•œ ์ •๋ ฌ