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

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ํ•ฉ๋ณ‘ ์ •๋ ฌ Merge Sort

NaNaRin๐Ÿ™ƒ 2021. 1. 28. 15:34

 

ํ•ฉ๋ณ‘ ์ •๋ ฌ (Merge Sort) ์•Œ๊ณ ๋ฆฌ์ฆ˜ :

๋ฐฐ์—ด์„ ์•ž๋ถ€๋ถ„๊ณผ ๋’ท๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋ณ‘ํ•ฉํ•˜๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

int[] merge = {8, 1, 4, 2, 7, 6, 3, 5}

1. ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค

2. ์•ž๋ถ€๋ถ„์„ ํ•ฉ๋ณ‘์ •๋ ฌ๋กœ ์ •๋ ฌํ•œ๋‹ค

3. ๋’ท๋ถ€๋ถ„์„ ํ•ฉ๋ณ‘์ •๋ ฌ๋กœ ์ •๋ ฌํ•œ๋‹ค

๋ฐฐ์—ด merge์˜ ํ•ฉ๋ณ‘ ์ •๋ ฌ ๊ณผ์ •

 

4. ์•ž๋ถ€๋ถ„๊ณผ ๋’ท๋ถ€๋ถ„์„ ๋ณ‘ํ•ฉํ•œ๋‹ค

   4-1. ์•ž๋ถ€๋ถ„์„ ๋ฐฐ์—ด buff์— ๋ณต์‚ฌ

   4-2. ๋ฐฐ์—ด buff์™€ ๋’ท๋ถ€๋ถ„์„ ๋ฐฐ์—ด a์— ๋ณ‘ํ•ฉ

   4-3. ๋ฐฐ์—ด buff์˜ ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด a์— ๋ณต์‚ฌ

๋ฐฐ์—ด merge์˜ ์•ž๋ถ€๋ถ„๊ณผ ๋’ท๋ถ€๋ถ„ ๋ณ‘ํ•ฉ ๊ณผ์ •

 

 

๋ฉ”์„œ๋“œ mergeSort() : ๋ฐฐ์—ด a์˜ ํฌ๊ธฐ n๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด buff๋ฅผ ์„ ์–ธํ•˜๊ณ , mergetSort()๋ฅผ ์‹คํ–‰ ํ›„ ์ •๋ ฌ์ด ๋๋‚˜๋ฉด ๋ฐฐ์—ด buff๋ฅผ ํ•ด์ œ

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

 

๋ฉ”์„œ๋“œ mergeSort() : ๋ฐฐ์—ด a์˜ index left ๋ถ€ํ„ฐ right ๊นŒ์ง€ ์š”์†Œ๋ฅผ ํ•ฉ๋ณ‘ ์ •๋ ฌ

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

 

- ํ•ฉ๋ณ‘ ์ •๋ ฌ : 

static int[] buff;

void mergeSort(int[] a, int n) {
	buff = new int[n];
	mergeSort(a, 0, n-1);
	buff = null;
}

void mergeSort(int[] a, int left, int right) {
	if(left < right) {
		int i;
		int center = (left + right) /2;
		int p = 0;
		int j = 0;
		int k = left;
			
		mergeSort(a, left, center);
		mergeSort(a, center + 1, right);
		
		for(i = left; i <= center; i++)
			buff[p++] = a[i];
            
		while(i <= right && j < p)
			a[k++] = (buff[j] <= a[i]) ? buff[j++] : a[i++];
				
		while(j < p)
			a[k++] = buff[j++];
	}
}

 

 

 

 

ํ•ฉ๋ณ‘ ์ •๋ ฌ Merge Sort :

์ตœ์„  = O(NlogN), ํ‰๊ท  = O(NlogN), ์ตœ์•… = O(NlogN)

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