Algorithm/Sort

선택 정렬(Selection Sort)

Soongle 2019. 6. 12. 17:53

Sort


선택 정렬(Selection Sort)을 구현해 보았다.

void selection_sort(int arr[], int n)
{
    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;
        }
        if(minIndex != i) swap(arr[minIndex], arr[i]);
    }
}

마지막 원소인 n-1번째 원소는 자동 정렬되기 때문에 n-1전까지 반복해 주었다.

(i+1) ~ (n-1)번째 원소들 중 가장 작은 값을 찾아 i번째 원소와 교환한다.

이 때, 자기 자신이 가장 작은 원소일 경우 쓸데없는 작업을 줄이기 위해 교환을 하지 않는다.


4 5 3 2 4 1 배열이 주어졌을 때 첫 반복에서 최소값 1을 찾은다음 첫번째 원소인 4와 위치를 바꾸게 되면

앞에있던 4와 뒤에있는 4의 상대적인 위치가 처음 상태와 바뀌게 되어 Stable한 정렬이 되지 않는다.

4 5 3 2 4 1

1 5 3 2 4 4


1 2 3 4 4 5

→ 처음 상태와 비교했을 때, 빨간색 4와 파란색 4의 상대적 위치가 바뀌었다! (Stable하지 않다)

따라서 선택정렬을 Stable한 정렬이 되게 하려면 swap을 사용하지 않고 값들을 한 칸씩 뒤로 옮기는 작업이 필요하다.

4 5 3 2 4 1

1 4 5 3 2 4


1 2 3 4 4 5

→ 빨간색 4와 파란색 4의 상대적위치가 유지된채로 정렬되었다. (Stable하다)

Best Case Worst Case Average Case Stable Inplace
O(n^2) O(n^2) Ө(n^2) ??? Yes

 


 

삽입 정렬(Insertion Sort)

Sort 선택 정렬(Selection Sort) 버블 정렬(Bubble Sort) 삽입 정렬(Insertion Sort) 삽입 정렬(Insertion Sort)를 구현해 보았다. void insertion_sort(int arr[], int n) { int j; for(int i = 1 ; i < n ; i++)..

soongle.tistory.com

 

버블 정렬(Bubble Sort)

Sort 선택 정렬(Selection Sort) 버블 정렬(Bubble Sort) 삽입 정렬(Insertion Sort) 버블 정렬(Bubble Sort)를 구현해 보았다. void bubble_sort(int arr[], int n) { for(int i = n-1 ; i > 0 ; i--) { bool sor..

soongle.tistory.com