๋ฐ˜๊ฐ€์›Œ์š”! ํ—ˆ๋ธŒ์ž…๋‹ˆ๋‹ค!

์ €๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ํ˜„๋Œ€ ์—ฐ๊ธˆ์ˆ ์‚ฌ๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋А๋‚€ ์ ๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ

[์ž๋ฃŒ๊ตฌ์กฐ] ํ€ต์ •๋ ฌ Quick Sort

mmin.h 2020. 8. 4. 11:30

์•ˆ๋…•ํ•˜์„ธ์š” ์ฃผ์ธ์žฅ H์ž…๋‹ˆ๋‹ค. 

์˜ค๋Š˜์€ ํ€ต์ •๋ ฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์ •๋ ฌ์€ ์‹œ๊ฐ„๋ณต์žก๋„ O(N^2)๋ฅผ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์˜€์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด

์‚ฌ์šฉํ•˜๊ธฐ์— ๋ถ€๋‹ด์ด ๋˜๊ฒ ์ง€์š”. ๊ทธ๋ ‡๊ธฐ์— ๋Œ€ํ‘œ์ ์ธ ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ”๋กœ ํ€ต์ •๋ ฌ์ž…๋‹ˆ๋‹ค. 

ํ€ต์ •๋ ฌ์€ ๋Œ€ํ‘œ์ ์ธ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ์„œ ํ‰๊ท ์†๋„๊ฐ€ O(N*log N)์ž…๋‹ˆ๋‹ค. 

 

1~10๊นŒ์ง€์˜ ๋ฌด์งˆ์„œํ•œ ์ˆซ์ž๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค๊ณ  ํ• ๋•Œ, 

ํ€ต ์ •๋ ฌ์€ ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ๋‘ ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. 

ํŠน์ •ํ•œ ๊ฐ’(ํ”ผ๋ฒ—pivot)์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž๋ฅผ ์„œ๋กœ ๊ตํ™˜ํ•œ ๋’ค์— ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด (1) 10 5 8 7 6 4 3 2 9 ๋ผ๋Š” ์ˆซ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ 1๋ณด๋‹ค ํฐ ์ˆซ์ž๋ฅผ ์™ผ์ชฝ์—์„œ, 1๋ณด๋‹ค ํฐ ์ˆซ์ž๋ฅผ ์˜ค๋ฅธ์ชฝ์—์„œ ์ฐพ์Šต๋‹ˆ๋‹ค. 

1๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋Š” ์ฐจ์ง€ ๋ชปํ•ด์„œ 1๊นŒ์ง€ ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ž‘์€ ๊ฐ’์˜ ์ธ๋ฑ์Šค๊ฐ€ ํฐ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 

ํ”ผ๋ฒ— ๊ฐ’๊ณผ ์ž‘์€ ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ์ฆ‰, 1๊ณผ 1์„ ์„œ๋กœ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. 

 

3 7 8 1 5 9 6 10 2 4 

 

3์„ ํ”ผ๋ฒ—๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค๋ฉด

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํฐ๊ฐ’, ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฐˆ๋•Œ ์ž‘์€๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค. 

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด 7 ๊ณผ 2๊ฐ€ ์„ ํƒ๋˜๋Š”๋ฐ ๋‘ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 

3 2 8 1 5 9 6 10 7 4 

 

ํ”ผ๋ฒ—๊ฐ’์€ ๋™์ผํ•˜๊ตฌ์š”. ๋‹ค์‹œ ์ง„ํ–‰์„ ํ•˜๋ฉด 3๋ณด๋‹ค ํฐ ๊ฐ’ 8, ์ž‘์€๊ฐ’ 1์„ ์ฐพ์Šต๋‹ˆ๋‹ค. 

 

3 2 1 8 5 9 6 10 7 4 

 

์ด๋ฒˆ์—” ํฐ ๊ฐ’์ด 8, ์ž‘์€ ๊ฐ’์ด 1. ์ธ๋ฑ์Šค๊ฐ€ ์„œ๋กœ ์—‡๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Ÿด๋• ์ž‘์€๊ฐ’๊ณผ ํ”ผ๋ฒ—๊ฐ’์„ ์„œ๋กœ ๊ตํ™˜ํ•ด์ค๋‹ˆ๋‹ค. 

 

1 2 3 8 5 9 6 10 7 4 

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด 3์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

์™ผ์ชฝ์—์„œ ํฐ๊ฐ’, ์˜ค๋ฅธ์ชฝ์—์„œ ์ž‘์€๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์—‡๊ฐˆ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— 1๊ณผ 1์„ ๊ตํ™˜ํ•ด์ค๋‹ˆ๋‹ค. 

 

2 8 5 9 6 10 7 4 

 

์ด์ œ 2๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ 1๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด 1 2 3 ์ด ์ •๋ ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

1 2 3 8 5 9 6 10 7 4 

์ด์ œ ์˜ค๋ฅธ์ชฝ๋„ 8์„ ํ”ผ๋ฒ—์œผ๋กœ ํ•˜์—ฌ ๋‹ค์‹œ ํ€ต์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ์š” 

8๋ณด๋‹ค ํฐ๊ฐ’ 9, ์ž‘์€๊ฐ’ 4 ์ธ๋ฑ์Šค๊ฐ€ ์•ˆ๊ฒน์น˜๋‹ˆ ์„œ๋กœ ๋ฐ”๊ฟ” ์ค๋‹ˆ๋‹ค. 

 

1 2 3 8 5 4 6 10 7 9

 

8๋ณด๋‹ค ํฐ ๊ฐ’ 10, ์ž‘์€๊ฐ’ 7. ์„œ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ๊ฒน์น˜์ง€ ์•Š์œผ๋‹ˆ ํ”ผ๋ฒ—์€ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. 

 

1 2 3 8 5 4 6 7 10 9

 

์ด์ œ ํฐ๊ฐ’ 10, ์ž‘์€๊ฐ’ 7 ์ธ๋ฑ์Šค๊ฐ€ ๊ฒน์น˜๋‹ˆ 8๊ณผ 7์„ ๊ตํ™˜ ํ•ด์ค๋‹ˆ๋‹ค. 

 

1 2 3 7 5 4 6 8 10 9

 

์ด์ œ ๋‹ค์‹œ 8์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ๊ทธ๋ฃน๊ณผ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฃน์„ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

7 5 4 6 ๊ทธ๋ฃน์„ ์ง„ํ–‰ํ•˜๋ฉด  7๋ณด๋‹ค ํฐ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋๊นŒ์ง€ ๊ฐ€๊ณ ,

์˜ค๋ฅธ์ชฝ์—์„  6, ์ธ๋ฑ์Šค๊ฐ€ ๊ฒน์น˜๋‹ˆ ์ž‘์€๊ฐ’๊ณผ ํ”ผ๋ฒ—๊ฐ’์„ ๊ตํ™˜ํ•ด์ค€๋‹ค. 

 

1 2 3 6 5 4 7 8 10 9

 

6์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํฐ๊ฐ’์ด ์—†๋‹ค. ์™ผ์ชฝ์œผ๋ก  4๊ฐ€ ์„ ํƒ ๊ทธ๋Ÿผ 6๊ณผ 4๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด,

 

1 2 3 4 5 6 7 8 10 9

 

์ดํ›„์—” ์„ค๋ช…์„ ์ƒ๋žตํ•˜๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

1 2 3 4 5 6 7 8 10 9

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

 

ํ•˜์ง€๋งŒ ํ€ต์ •๋ ฌ์ด ์–ธ์ œ๋‚˜ ๋น ๋ฅผ๊ฐ€์š”?

ํ€ต ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N*log N)์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ

์ตœ์•…์˜ ๊ฒฝ์šฐ, ์ด๋ฏธ ์ •๋ ฌ์ด ๊ฑฐ์˜ ๋‹ค ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. 

 

 

#include <stdio.h>
int data[] = { 4,10,5,3,2,9,7,8,6,1 };
int number = 10; 

quickSort(int* data, int start, int end) {
	if (start >= end) {
		return;
	}

	int key = start; //key๋Š” ์ฒซ ๋ฒˆ์งธ ์›์†Œ
	int i = start + 1; 
	int j = end;
	int temp;

	while (i <= j) { //์—‡๊ฐˆ๋ฆด๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต
		//ํ‚ค๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋งŒ๋‚  ๋•Œ
		while (i <= end && data[i] <= data[key]) {
			i++;
		}
		while (data[j] >= data[key]) {
			j--;
		}
		//ํ˜„์žฌ ์—‡๊ฐˆ๋ฆฐ ์ƒํƒœ๋ฉด ํ‚ค ๊ฐ’๊ณผ ๊ต์ฒด
		if (i > j) {
			temp = data[j];
			data[j] = data[key];
			data[key] = temp;
		}
		//์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด i์™€ j๋ฅผ ๊ต์ฒด
		else {
			temp = data[i];
			data[i] = data[j];
			data[j] = temp;
		}
	}

	quickSort(data, start, j - 1);
	quickSort(data, j + 1, end);
}


int main(void) {
	quickSort(data, 0, number - 1);
	for (int i = 0; i < number; i++) {
		printf("%d", data[i]);
	}
	return 0;
}