Unity/알고리즘

정렬 알고리즘①(버블,선택,삽입,퀵)

_딩동 2025. 2. 24. 21:34
정렬 (Sorting)은 데이터를 일정한 기준(오름차순, 내림차순 등)에 따라 정렬하는 과정을 의미합니다.
빠르고 효율적인 정렬 알고리즘을 선택하는 것이 중요하며, 
정렬 방식에 따라 시간 복잡도와 공간 복잡도가 달라집니다.

 

1. 버블 정렬 (Bubble Sort)

○ 옆에 있는 값과 비교하여 교환하는 방식

○ 큰 값이 계속 오른쪽으로 이동합니다. (마치 거품처럼 떠오르는 느낌)

void BubbleSort(int[] arr)
{
	int n = arr.Length;
    for(int i=0; i<n-1; i++)
    {
    	for(int j=0; j<n-i-1; j++)
        {
        	if(arr[j] > arr[j+1])
            {
            	//Swap
                (arr[j], arr[j+1]) = (arr[j+1], arr[j]);
            }
        }
    }
}

✅ 단순하지만 매우 비효율적 입니다.

✅ 거의 정렬된 경우 최적화가 가능합니다.

 

 

2. 선택 정렬 (Selection Sort)

○ 가장 작은 값을 선택하여 정렬

○ 첫 번째 요소부터 시작하여 가장 작은 값을 찾아서 앞으로 이동합니다.

void SelectionSort(int[] arr)
{
	int n = arr.Length;
    for(int i=0; i<n-1; i++)
    {
    	int minIndex = i;
        for(int j=i+1; j<n; j++)
        {
        	if(arr[j] < arr[minIndex])
            	minIndex = j;
        }
        // Swap
        (arr[i], arr[minIndex]) = (arr[minIndex], arr[i]);
    }
}

✅ 제자리 정렬 (in-place sorting)

✅ 시간 복잡도 O(n²)로 비효율적입니다.

 

3. 삽입 정렬 (Insertion Sort)

현재 요소를 올바른 위치에 삽입합니다

○ 왼쪽은 이미 정렬된 상태 입니다.

void InsertionSort(int[] arr)
{
	int n = arr.Length;
    for(int i=1; i<n; i++)
    {
    	int key = arr[i];
        int j = i-1;
        while(j>=0 && arr[j] > key)
        {
        	arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

✅ 거의 정렬된 데이터에 대해는 빠릅니다 (O(n))

✅ 삽입과 이동 연산이 많아 큰 데이터에서는 비효율적입니다(O(n²))

 

4. 퀵 정렬 (Quick Sort)

피벗(Pivot)을 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할합니다.

분할 정복 (Dovode & Conquer) 기법을 사용합니다.

void QuickSort(int[] arr, int left, int right)
{
	if(left < right)
    {
    	int pivotIndex = Partition(arr. left, right);
        QuickSort(arr, left, pivotIndex - 1);
        QuickSort(arr, pivotIndex + 1, right);
    }
}

int Partition(int[] arr, int left, int right)
{
	int pivot = arr[right];
    int i = left - 1;
    
    for(int j=left; j<right; j++)
    {
    	if(arr[j] < pivot)
        {
        	i++;
            (arr[i], arr[j]) = (arr[j], arr[i]);
        }
    }
    (arr[i+1], arr[right]) = (arr[right], arr[i+1]);
    return i+1;
}

✅ 평균 O(n log n)으로 매우 빠름

✅ 최악의 경우 O(n²) 발생 가능합니다.

 

 

2편으로...

 

 

긴 글 읽어주셔서 감사합니다
도움이 되셨다면 공감 & 댓글 응원 부탁드립니다