Notice
Recent Posts
Recent Comments
Link
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Tags
more
Archives
Today
Total
관리 메뉴

기록

Sorting 본문

공부/Algorithm

Sorting

aoieuo 2020. 9. 30. 16:52

정렬 알고리즘

1. 선택 정렬 (Selection Sort)

​ 1 10 5 8 7 6 4 3 2 9

이걸 오름차순으로 정렬할 때, 가장 작은 걸 골라(select) 맨 앞으로 가져오는 알고리즘이다.

Source Code

#include <stdio.h>

int main(void){
    int i, j, min, index, temp;
    int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
    for(i = 0; i < 10; i++){
        min = 9999; //가장 큰 숫자
        for(j = i; j < 10; j++){
            if(min > array[j]){
                //min값을 i번째 부터 마지막 원소까지 검사한다.
                min = array[j];
                index = j;
            }
            temp = array[i]; //원래 i번째 있던 값을 temp에 저장
            array[i] = array[index]; //최솟값을 i번째로 대입
            array[index] = temp; //temp를 바꾼 자리에 저장
        }
    }
}

<시간 복잡도 - 선택 정렬>

​ 10 + 9 + 8 + … + 1

=> 10 * (10 + 1) / 2 = 55

=> N * (N + 1) / 2

=> O(N * N)

=> O(N^2)

​ 선택 정렬은 시간 복잡도가 N제곱 이므로 비효율적인 알고리즘이다.

2. 버블 정렬 (Bubble Sort)

1 10 5 8 7 6 4 3 2 9

이걸 오름차순으로 정렬할 때, 바로 옆에 있는 수와 비교해 큰 수를 뒤로 보내는 것을 계속 반복한다.

정렬 알고리즘 중에서 가장!! 비효율적인 알고리즘이다.

이유: 위의 선택 정렬과 비교해보면 for - for 문 안에서 대입하는 횟수

​ 선택 정렬은 min = array[j]로 1번이지만

​ 버블 정렬은 swap을 하기 때문에 3번이기 때문에

시간복잡도는 같아도, 실직적인 수행 시간에서 차이가 난다.

Source Code

#include <stdio.h>

int main(void){
    int i, j, temp;
    int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};ay
    for(i = 0; i < 10; i++){ //원소의 개수만큼 반복
        for(j = 0; j < 9-i; j++){ //마지막 index부터 가장 큰 수를 뒤로 보내는 것을 반복
            if(array[j] > array[j+1]){
                temp = array[j];
                array[j] = array[j+1];
                array[j+1]
            }
        }
    }
}

<시간복잡도 - 버블정렬>

​ 10 + 9 + 8 + … + 1

=> 10 * (10 + 1) / 2 = 55

=> N * (N + 1) / 2

=> O(N * N)

=> O(N^2)

3. 삽입정렬 (Insertion Sort)

​ 1 10 5 8 7 6 4 3 2 9

​ 삽입 정렬은 각 숫자를 적절한 위치에 삽입하는 방법으로 문제를 해결한다. 다른 정렬 방식들은 무조건 위치를 바꾸는 방식이었다면, 삽입 정렬은 '필요할 때만' 위치를 바꾸게 된다.

시간복잡도 O(N^2)인 정렬 알고리즘 중에서 가장 빠르다.

각 숫자를 삽입할 때, 이미 앞에 있는 숫자들은 정렬이 되어있기 때문에 빠르다.

그렇다고 엄청 빠른 건 아니다.

Source Code

#include <stdio.h>

int main(void){
    int i, j, temp;
    int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
    for(i = 0; i < 10; i ++){
        j = i;
        while(array[j] > array[j]+1){
            temp = array[j];
            array[j] = array[j+1];
            array[j+1] = temp;
            j--;
        }
    }
    return 0;
}

<시간복잡도 - 삽입정렬>

​ 10 + 9 + 8 + … + 1

=> 10 * (10 + 1) / 2 = 55

=> N * (N + 1) / 2

=> O(N * N)

=> O(N^2)

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

DynamicProgramming  (0) 2020.09.30
BinaryTree  (0) 2020.09.30
Searching  (0) 2020.09.30
[알고리즘] 동적 계획법 (Dynamic Programming)  (0) 2020.08.11
[알고리즘] 선택정렬, 버블정렬, 삽입정렬 - O(N^2)  (0) 2020.08.11
Comments