[C++] ์ •๋ ฌ(Sort)

2020. 4. 29. 18:34ยท๐Ÿ“ Computer Science/โœ Algorithm

1. ๊ธฐ๋ณธ์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n^2)

 

1) ์„ ํƒ ์ •๋ ฌ

๋ฐฐ์—ด ์•ˆ์—์„œ ๊ฐ€์žฅ ํฐ ์›์†Œ๋ฅผ ์ฐพ์•„ ๋ฐฐ์—ด์˜ ๋งจ ๋ ์ž๋ฆฌ์™€ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์„ ํƒ ์ •๋ ฌ

for (int i = 0; i < MaxSize - 1; i++) {
	Least = i;
	for (int j = i + 1; j < MaxSize - 1; j++)
		if (Array[j] < Array[Least])
			Least = j;

	if (i != Least) {
		int Temp = Array[i];
		Array[i] = Array[Least];
		Array[Least] = Temp;
	}
}

 

2) ๋ฒ„๋ธ” ์ •๋ ฌ

์™ผ์ชฝ๋ถ€ํ„ฐ ์ด์›ƒํ•œ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ˆœ์„œ๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์„œ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋ฒ„๋ธ” ์ •๋ ฌ

for (int i = MaxSize - 1; i > 0; i--)
	for (int j = 0; j < i; j++)
		if (Array[j] > Array[j + 1]) {
			int Temp = Array[j];
			Array[j] = Array[j + 1];
			Array[j + 1] = Temp;
		}

 

3) ์‚ฝ์ž… ์ •๋ ฌ

๋‘ ๋ฒˆ์งธ ์ˆซ์ž๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์•ž์˜ ์ˆซ์ž๋“ค๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์ž๊ธฐ ์ž๋ฆฌ๋ฅผ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์‚ฝ์ž… ์ •๋ ฌ

for (int i = 1; i < MaxSize; i++) {
	int Target = Array[i];
	for (int j = i - 1; j >= 0 && Array[j] > Target; j--)
		Array[j + 1] = Array[j];
	Array[j + 1] = Target;
}

 

2. ๊ณ ๊ธ‰ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ O(nlogn)

 

1) ๋ณ‘ํ•ฉ ์ •๋ ฌ

๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค ์ „๋ฐ˜๋ถ€์™€ ํ›„๋ฐ˜๋ถ€๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์ •๋ ฌ๋œ ๋‘ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ํ•ฉ์นœ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜๋ˆˆ ์ „๋ฐ˜๋ถ€์™€ ํ›„๋ฐ˜๋ถ€๋ฅผ ์ •๋ ฌํ•  ๋•Œ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ •๋ ฌํ•œ๋‹ค.

  • ์ˆœ์ฐจ์ ์ธ ๋น„๊ต๋กœ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ ์‹œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ ์ด๋‹ค.
void MergeSort(int* Array, int start, int end)
{
	if (start >= end)
		return;

	int mid = (start + end) / 2;
	MergeSort(Array, start, mid);
	MergeSort(Array, mid + 1, end);

	int tmp[1000] = {};
	int i = start, j = mid + 1, k = start;
	while (i <= mid && j <= end) {
		if (Array[i] < Array[j])
			tmp[k++] = Array[i++];
		else
			tmp[k++] = Array[j++];
	}

	while (i <= mid)
		tmp[k++] = Array[i++];
	while (j <= end)
		tmp[k++] = Array[j++];

	for (i = start; i <= end; ++i)
		Array[i] = tmp[i];
}

 

2) ํ€ต ์ •๋ ฌ

๊ธฐ์ค€ ์›์†Œ(Pivot)๋ฅผ ์‚ผ์•„ ์ž‘์€ ์ˆ˜๋Š” ์™ผ์ชฝ, ํฐ ์ˆ˜๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์žฌ๋ฐฐ์น˜ํ•œ๋‹ค. ์žฌ๋ฐฐ์น˜๊ฐ€ ๋๋‚˜๋ฉด ๋˜ ๊ธฐ์ค€ ์›์†Œ๋ฅผ ์‚ผ์•„ ์žฌ๊ท€์  ๋ฐ˜๋ณตํ•˜์—ฌ ์ •๋ ฌํ•œ๋‹ค.

  • C++์˜ Sort ๋‚ด ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

ํ€ต ์ •๋ ฌ

void QuickSort(int* Array, int Left, int Right)
{
	int Pivot = Left;
	int LeftPivot = Left;
	int RightPivot = Right;

	while (LeftPivot < RightPivot)
	{
		while (Array[LeftPivot] <= Array[Pivot] && LeftPivot < Right)
			LeftPivot++;

		while (Array[RightPivot] >= Array[Pivot] && RightPivot > Left)
			RightPivot--;

		if (LeftPivot < RightPivot) {
			swap(Array[LeftPivot], Array[RightPivot]);
			continue;
		}

		swap(Array[Pivot], Array[RightPivot]);
		QuickSort(Array, Left, RightPivot - 1);
		QuickSort(Array, RightPivot + 1, Right);
	}
}

 

3) ํž™ ์ •๋ ฌ

๋ฐฐ์—ด์„ ํž™์œผ๋กœ ๋งŒ๋“ค๊ณ  ๋ฃจํ”„ ๋…ธ๋“œ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ํž™์—์„œ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ์ •๋ ฌํ•œ๋‹ค.

  • ๊ฐ€์žฅ ํฌ๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ตฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

3. ํŠน์ˆ˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)

 

1) ๊ณ„์ˆ˜(Counting) ์ •๋ ฌ

ํ•ญ๋ชฉ๋“ค์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ง‘ํ•ฉ์— ๊ฐ ํ•ญ๋ชฉ์ด ๋ช‡ ๊ฐœ์”ฉ ์žˆ๋Š”์ง€ ์„ธ๋Š” ์ž‘์—…์ด๋‹ค.

  • ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ ์šฉํ•œ๋‹ค.
  • ์ง‘ํ•ฉ ๋‚ด ๊ฐ€์žฅ ํฐ ์ •์ˆ˜๋ฅผ ์•Œ์•„์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
// N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
// ์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 10,000,000)์ด ์ฃผ์–ด์ง„๋‹ค.
// ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๊ณ  10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.
    
int arr[10001] = {};
for (int i = 0; i < n; i++) {
	int num;
	scanf("%d", &num);
	arr[num]++;
}

for (int i = 1; i <= 10000; i++)
	while (arr[i]-- != 0)
		printf("%d\n", i);

 

2) ๊ธฐ์ˆ˜(Radix) ์ •๋ ฌ

๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ(Radix)๋ฅผ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

4. Stable Sort(์•ˆ์ •์„ฑ ์žˆ๋Š” ์ •๋ ฌ)

๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ๊ฐ€ ์ •๋ ฌ ํ›„์—๋„ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ •๋ ฌ๋กœ ๋ฒ„๋ธ” ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ๋ณ‘ํ•ฉ ์ •๋ ฌ, ๊ธฐ์ˆ˜ ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ์ด ์žˆ๋‹ค.

 

5. ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ

  • ์‹œ๊ฐ„ ๋ณต์žก๋„์— ๋”ฐ๋ผ ์„ ํƒ
  • ๊ณต๊ฐ„ ๋ณต์žก๋„์— ๋”ฐ๋ผ ์„ ํƒ: ๋ณ‘ํ•ฉ ์ •๋ ฌ ๊ฐ™์€ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • Stable์— ๋”ฐ๋ผ ์„ ํƒ

 

์‹œ๊ฐ„ ๋ณต์žก๋„

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] ๋ธŒ๋ฃจํŠธ ํฌ์Šค(Brute Force)
  • [C++] ํ•ด์‹œ(Hash)
  • [C++] ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ•˜๋…ธ์ด ํƒ‘
  • [C/C++] Tip
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] ์ •๋ ฌ(Sort)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”