[알고리즘] 정렬

선형 배열의 index를 일정 기준에 따라 정렬하는 방법을 말한다. 일반적으로 가장 작은 값에서 가장 큰 값 순으로 정렬시킨다.

선택정렬

비교 기준 인덱스 보다 작은 값을 ‘선택’ 한다.

최대, 최소, 평균 실행시간 모두 Θ(n^2) 이다.

선택정렬의 로직은 다음과 같다.

그림으로 표현하자면 다음과 같다.

https://68.media.tumblr.com/85c59c6093edebdf4215630a0eaf5485/tumblr_oor2n1tGVH1w8w3y8o1_540.jpg

코드는 다음과 같다.

#include <iostream>
using namespace std;

int main(){
    int arr[10] = {10,-1,3,2,6,4,9,30,7,14};
    int temp;
    
    for(int i=0; i<9; i++){
        for (int j=i; j<10; j++){
            if(arr[i]>arr[j]){
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    
    for(int k=0; k<10; k++){
        cout << arr[k] << ", ";
    }
}

삽입정렬

최대, 최소, 평균 실행시간 모두 Θ(n^2) 이다.

숫자가 적힌 카드를 갖고 있고 이 카드들이 순서대로 정렬되어 있다고 가정하자. 만약 새로운 숫자가 적힌 카드를 받았을 때 정렬된 기존의 카드 안에 집어넣기 위해서는 어떻게 해야할까? 앞서 정렬된 카드들의 숫자를 새 카드의 숫자와 하나하나 비교하면서 올바른 자리를 찾아갈 것이다.

삽입정렬도 이와 비슷한 개념이다. 로직은 다음과 같다.

그림으로 나타내면 다음과 같다.

https://68.media.tumblr.com/bf564cc583677fd84449a2c655161d33/tumblr_oor7j8NxSh1w8w3y8o1_1280.jpg

코드는 다음과 같다.

#include <iostream>
using namespace std;

int main(){
    int arr[10] = {10,-1,3,2,6,4,9,30,7,14};
    int temp;
    for(int i=1; i<10; i++){
        for(int j=i-1; j>=0; j--){
            if(arr[j]>arr[j+1]){
                temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            } else break;
        }
    }
    
    for(int i=0; i<10; i++){
        cout << arr[i] << ", ";
    }
}

병합정렬