ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [간단 정리] 정렬 알고리즘(버블, 선택, 삽입)
    컴퓨터 과학/자료구조와 알고리즘 2019. 11. 26. 19:44

    *오름차순 기준입니다

     

    1. 버블정렬

    첫 번째 자료부터 마지막 자료까지 인접한 자료끼리 비교해가면서 교환한다. 정렬이 되어 있지 않은 자료를 기준으로(최악) 최초에 n-1번, 그다음에 n-2번, 그다음에 n-3번, 이렇게 해서 최대 횟수는 1 + 2 + .. + (n-1) = n(n-1)/2이므로 시간복잡도는 O(N^2)이다. 최고, 평균, 최악의 경우 모두 O(N^2). 구현은 매우 간단하고 성능이 안 좋다. 교환할 때마다 3번의 임시복사가 일어나기 때문이다.

     

    >>구현

    #include <cstdio>
    #include <cstdlib>
    
    void BubbleSort(int arr[], int size);
    void Swap(int& value1, int& value2);
    void PrintArr(int arr[], int size);
    
    int main()
    {
    	int arr[] = { 7, 5, 2, 3, 1, 6, 4 };
    	BubbleSort(arr, _countof(arr));
    	PrintArr(arr, _countof(arr));	
    	return 0;
    }
    
    void Swap(int& value1, int& value2)
    {
    	int temp = value1;
    	value1 = value2;
    	value2 = temp;
    }
    
    void BubbleSort(int arr[], int size)
    {
    	for (int i = 0; i < size - 1; ++i)
    	{
    		for (int j = 0; j < size - 1; ++j)
    		{
    			if (arr[j] > arr[j + 1])
    			{
    				Swap(arr[j], arr[j + 1]);
    			}
    		}
    	}
    }
    
    void PrintArr(int arr[], int size)
    {
    	for (int i = 0; i < 7; ++i)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    

     

     

    2. 선택정렬

    최소값을 '선택'한 다음에 맨 앞에 놓는 것이 기본 개념. 전체 배열 중에서 가장 작은 값을 찾아 맨 앞에 놓는다. 정확히는 둘이 교환한다. 그다음에는 맨 앞 원소를 뺀, 두 번째 원소부터 마지막까지의 원소 중에서 가장 작은 값을 찾아 맨 앞(전체 배열에서는 두 번째)에 놓는다. 이 과정을 반복한다. 마지막에는 하나의 원소만 남고 이미 정렬된 상태이기 때문에 수행하지 않아도 된다.  시간복잡도는, 구현에서 보면 내부 반복문이 n-1, n-2..으로 진행되며 외부 반복문은 n-1회다. 즉 (n-1) + (n-2) + .. + 1 이기 때문에 n(n-1) / 2이므로 O(N^2)이다.

     

    >>구현

    #include <cstdio>
    #include <cstdlib>
    
    void SelectionSort(int arr[], int size);
    void Swap(int& value1, int& value2);
    void PrintArr(int arr[], int size);
    
    int main()
    {
    	int arr[] = { 7, 5, 2, 3, 1, 6, 4 };
    	SelectionSort(arr, _countof(arr));
    	PrintArr(arr, _countof(arr));
    	return 0;
    }
    
    void SelectionSort(int arr[], int size)
    {
    	for (int i = 0; i < size - 1; ++i)
    	{
    		int leastIndex = i;
    		for (int j = i + 1; j < size; ++j)
    		{
    			if (arr[leastIndex] > arr[j])
    			{
    				leastIndex = j;
    			}
    		}
    		if (leastIndex != i)
    		{
    			Swap(arr[i], arr[leastIndex]);
    		}
    	}
    }
    
    void Swap(int& value1, int& value2)
    {
    	int temp = value1;
    	value1 = value2;
    	value2 = temp;
    }
    
    void PrintArr(int arr[], int size)
    {
    	for (int i = 0; i < 7; ++i)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    

     

     

    3. 삽입정렬

    특정 원소를 원하는 위치에 '삽입'하는 과정을 반복해 정렬을 수행한다. 특정 원소의 선택은 두 번째 원소부터 시작해 역순으로 대소 비교를 통해 원하는 위치에 특정 원소를 삽입한다. 원하는 위치에 특정 원소를 삽입하기 위해서는 기존 원소를 한 칸씩 밀어내면 된다. 즉, 두 번째 원소를 시작으로, 첫 번째 원소와 비교하고, 세 번째 원소는 두 번째, 첫 번째 원소와 비교를 한다. 즉, 특정 원소의 인덱스보다 작은 원소는 정렬이 된 상태이기 때문에, 이미 정렬이 완료된 자료의 경우에만 내부 반복문을 수행하지 않으므로 시간 복잡도가 O(N)이며, 나머지 경우는 O(N^2)이다.

     

    간단하게 {1, 2, 3}을 예로 들어 두 번째 원소인 2부터 시작해보자. 첫 번째 원소인 1이 더 작으므로 삽입은 이루어지지 않는다. 세 번째 원소인 3 역시 역순의 첫 번째 순서인 두 번째 원소가 더 작으므로 삽입이 이루어지지 않는다. 2번만에 수행이 끝난다. 버블 정렬이나 선택 정렬의 경우에는 정렬이 되어 있는 경우라도 내부 반복문을 타야 한다.

     

    >>구현

    #include <cstdio>
    #include <cstdlib>
    
    void InsertionSort(int arr[], int size);
    void PrintArr(int arr[], int size);
    
    int main()
    {
    	int arr[] = { 7, 5, 2, 3, 1, 6, 4 };
    	InsertionSort(arr, _countof(arr));
    	PrintArr(arr, _countof(arr));
    	return 0;
    }
    
    void InsertionSort(int arr[], int size)
    {
    	int key = 0;
    	int j = 0;
    	for (int i = 1; i < size; ++i)
    	{
    		key = arr[i];
    		for (j = i - 1; j >= 0 && key < arr[j]; --j)
    		{
    			arr[j + 1] = arr[j];
    		}
    		arr[j + 1] = key;
    	}
    }
    
    void PrintArr(int arr[], int size)
    {
    	for (int i = 0; i < 7; ++i)
    	{
    		printf("%d ", arr[i]);
    	}
    	printf("\n");
    }
    

    '컴퓨터 과학 > 자료구조와 알고리즘' 카테고리의 다른 글

    그래프 간선의 분류 간단 정리  (0) 2021.09.14
    hash map  (0) 2021.08.07
    [스크랩] hashmap  (0) 2021.08.07
    [간단 정리] 퀵 정렬  (0) 2019.11.27

    댓글

Designed by Tistory.