개념 요약

  • 분할 정복을 통해 주어진 배열을 정렬한다.
    • 분할 정복 : 문제를 2개의 문제로 분리하여 각각 해결하고 결과를 모아서 해결하는 전략이다.
  • 분리할 때 비 균등하게 분할하여 해결한다.

 


정렬 과정

  1. 배열 내의 하나의 원소를 고른다.(pivot을 고름)
  2. pivot보다 작으면 pivot의 앞으로, pivot보다 크면 pivot의 뒤로 분리한다.
  3. 1 -> 2의 과정을 분리된 상태에서 재귀적으로 반복한다.

 


코드

void	quick_sort(std::vector<int> &unsorted_array, int left, int right)
{
	//왼쪽값이 오른쪽 값보다 크다면 끝
	if (left >= right)
		return ;
	// 피봇과 왼쪽 인덱스 저장
	int	i = left, j = left, temp = 0;
	int	&pivot = unsorted_array[right];
	// 오른쪽 인덱스까지 루프
	for (; j < right; ++j)
	{
		// 피봇보다 작다면 swap
		if (unsorted_array[j] < pivot)
		{
			temp = unsorted_array[i];
			unsorted_array[i] = unsorted_array[j];
			unsorted_array[j] = temp;
			++i;
		}
	}
	// 피폿 교체
	temp = unsorted_array[i];
	unsorted_array[i] = pivot;
	pivot = temp;
	// 재귀
	quick_sort(unsorted_array, left, i - 1);
	quick_sort(unsorted_array, i + 1, right);
}

 


시간 복잡도

  • 피봇을 매번 중간값을 잡은 경우(최선의 경우)에 $O(nlog_2n)$이다.
  • 배열이 이미 오름차순 또는 내림차순으로 정렬되어있는 경우 $O(n^2)$이다.

 


공간 복잡도

  • 주어진 배열 내에서 swap으로 정렬하므로 $O(n)$이다.

 

 


장단점

  • 불필요한 데이터의 이동을 줄이고, 한번 결정된 피벗을 제외하기 때문에 동일 시간 복잡도를 가진 다른 정렬보다 빠르다.
  • 불안정 정렬이며 이미 정렬돼있다면 오히려 비효율적이다.

'CS공부 > Algorithm' 카테고리의 다른 글

힙 정렬(Heap Sort)  (0) 2022.06.21
병합 정렬(Merge Sort)  (0) 2022.06.21
삽입 정렬(Insertion Sort)  (0) 2022.06.20
선택 정렬(Selection Sort)  (0) 2022.06.20
거품 정렬(Bubble Sort)  (0) 2022.06.20

개념 요약

  • Selection Sort와 유사하지만, 더 효율적인 정렬 방법이다.
  • 자료의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입하는 정렬 방법이다.

 


정렬 과정

  1. 시작 인덱스를 2번째 인덱스부터 시작한다.
  2. 시작 인덱스 값과 이전의 인덱스 값을 비교하여 삽입한다.
  3. 시작 인덱스 + 1을 2번 과정으로 반복한다. 

 


코드

void	insertion_sort(std::vector<int> &unsorted_array)
{
	int	temp = 0, prev_idx = 0;
	// 2번째 인덱스 부터 시작
	for (int idx = 1; idx < unsorted_array.size(); ++idx)
	{
		// 현재 인덱스 값, 루프를 돌 인덱스 저장
		temp = unsorted_array[idx];
		prev_idx = idx - 1;
		while (prev_idx >= 0 && unsorted_array[prev_idx] > temp)
		{
			// 뒤로 땡기기
			unsorted_array[prev_idx + 1] = unsorted_array[prev_idx];
			--prev_idx;
		}
		// 찾은 위치에 삽입
		unsorted_array[prev_idx + 1] = temp;
	}
}

 


시간 복잡도

  • 최악의 경우는 $O(n^2)$이다.
  • 하지만 모두 정렬되어있는 경우 $O(n)$이고 평균적으로 $O(n^2)$이다.

 


공간 복잡도

  • 주어진 배열 내에서 swap 하므로 $O(n)$이다.

 


장단점

  • 알고리즘이 단순하고 정렬되어있을 경우엔 매우 효율적이다.
  • 버블 정렬, 선택 정렬보다 상대적으로 빠르며, 안정한 정렬이다.
  • 평균, 최악의 시간 복잡도가 $O(n^2)$으로 비효율적이다.

'CS공부 > Algorithm' 카테고리의 다른 글

힙 정렬(Heap Sort)  (0) 2022.06.21
병합 정렬(Merge Sort)  (0) 2022.06.21
퀵 정렬(Quick Sort)  (0) 2022.06.20
선택 정렬(Selection Sort)  (0) 2022.06.20
거품 정렬(Bubble Sort)  (0) 2022.06.20

개념 요약

  • Bubble Sort와 유사한 알고리즘이다.
  • 해당 순서에 원소를 넣을 위치는 이미 정해져 있으며 어떤 원소를 넣을지 선택하는 알고리즘이다.

 


정렬 과정

  1. 주어진 배열 중 최솟값을 찾는다.
  2. 찾은 값을 맨 앞에 위치한 값과 교체한다.
  3. 맨 처음 위치를 뺀 나머지 배열을 같은 방법으로 교체한다.

 


코드

void	selection_sort(std::vector<int> &unsorted_array)
{
	int	temp = 0, min_idx = 0, max = unsorted_array.size();
	// 위치 지정 인덱스
	for (int i = 0; i < max - 1; ++i)
	{
		// 현재 인덱스값 지정
		min_idx = i;
		for (int j = i + 1; j < max; ++j)
		{
			// 대소 비교
			if (unsorted_array[j] < unsorted_array[min_idx])
				min_idx = j;
		}
		// swap
		temp = unsorted_array[min_idx];
		unsorted_array[min_idx] = unsorted_array[i];
		unsorted_array[i] = temp;
	}
}

 


시간 복잡도

  • 거품 정렬과 동일한 방식으로 최선, 평균, 최악의 경우에 $O(n^2)$이다.

 


공간 복잡도

  • 주어진 배열 내에 교환으로 정렬이 수행되므로 $O(n)$이다.

 


장단점

  • 알고리즘이 단순하며, 배열 내부에서 swap 하는 방식으로 추가 메모리가 필요 없다.
  • 비효율적이고 불안정한 정렬이다.

'CS공부 > Algorithm' 카테고리의 다른 글

힙 정렬(Heap Sort)  (0) 2022.06.21
병합 정렬(Merge Sort)  (0) 2022.06.21
퀵 정렬(Quick Sort)  (0) 2022.06.20
삽입 정렬(Insertion Sort)  (0) 2022.06.20
거품 정렬(Bubble Sort)  (0) 2022.06.20

개념 요약

  • 서로 인접한 두 원소의 대소 비교하여 정렬하는 알고리즘
  • 시간 복잡도가 $O(n^2)$로 느리다.
  • 코드가 단순하다.

 


정렬 과정

  1. 1번째 회전에 i번째 원소와 i+1번째 원소의 대소를 비교하여 조건에 맞지 않는다면 swap 한다.(i는 1부터 마지막-1이다.)
  2. 1회전을 수행하면 가장 큰 원소가 맨뒤로 이동하여 2회전으로는 마지막 원소는 정렬에 제외되는데,
    이처럼 회전 한 번당 정렬된 원소가 하나씩 뒤에 쌓이는 것이다.

 


코드(c++)

void	bubblesort(std::vector<int> &unsorted_array)
{
	int	temp = 0, max = unsorted_array.size();
	// 마지막 원소에서 제외할 원소들
	for (int i = 0; i < max; ++i)
	{
    	// 비교하는 원소들
		for (int j = 1; j < max - i; ++j)
		{
			// 조건확인(오름차순)
			if (unsorted_array[j - 1] > unsorted_array[j])
			{
				// swap
				temp = unsorted_array[j - 1];
				unsorted_array[j - 1] = unsorted_array[j];
				unsorted_array[j] = temp;
			}
		}
	}
}

 


시간 복잡도

  • 수식은 아래와 같이 볼 수 있다.
    $$(n - 1) + (n - 2) + (n - 3) + (n - 4)... => \frac {n(n + 1)}{2}$$
  • 정렬의 여부를 확인하지 않고 비교하기 때문에 최선, 평균, 최악의 경우 모두 $O(n^2)$이다.

 


공간 복잡도

  • 주어진 배열 내에서 교환으로 정렬이 수행되므로 $O(n^2)$이다.

 


장단점

  • 구현이 간단하고 직관적이다.
  • 시간 복잡도가 $O(n^2)$으로 많이 비효율적이다.

'CS공부 > Algorithm' 카테고리의 다른 글

힙 정렬(Heap Sort)  (0) 2022.06.21
병합 정렬(Merge Sort)  (0) 2022.06.21
퀵 정렬(Quick Sort)  (0) 2022.06.20
삽입 정렬(Insertion Sort)  (0) 2022.06.20
선택 정렬(Selection Sort)  (0) 2022.06.20

+ Recent posts