본문 바로가기

컴퓨터과학(CS)/알고리즘

선택 정렬, 삽입 정렬

선택정렬

내 코드

#include <iostream>
using namespace std;

int main()
{
    int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8}, minNum = 21e8, minLevel = -1;
    for(int i=0; i<10; i++)
    {
        minNum = 21e8;
        minLevel = -1;
        for(int j = i; j< 10; j++)
        {
            if(minNum > arr[j])
            {
                minNum = arr[j];
                minLevel = j;
            }
        }
        int a = arr[minLevel];
        arr[minLevel] = arr[i];
        arr[i] = a;
    }
    for(int i=0; i<10; i++)
        cout << arr[i] << ' ';
    return 0;
}

교재 코드

#include <bits/stdc++.h>

using namespace std;

int n = 10;
int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

int main(void) {
    for (int i = 0; i < n; i++) {
        int min_index = i; // 가장 작은 원소의 인덱스 
        for (int j = i + 1; j < n; j++) {
            if (arr[min_index] > arr[j]) {
                min_index = j;
            }
        }
        swap(arr[i], arr[min_index]); // 스와프
    }
    for(int i = 0; i < n; i++) {
        cout << arr[i] << ' ';
    }
}

 

교재 코드는 가장 작은 원소의 인덱스의 값을 최솟값으로 놓고 시작하여 i+1로 시작하지만 난 i부터 값을 비교하여 구한다는 차이가 있지만 사실상 같은 풀이이다. 오히려 나는 minNum에 값을 저장하여 메모리와 시간을 낭비하였다. 

 

삽입정렬

내 코드

#include <iostream>
using namespace std;

int main()
{
    int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
    
    for(int i= 1; i<10; i++)
    {
        for(int j= i; j> 0; j--)
        {
            if(arr[j] > arr[j-1]) break;
            swap(arr[j], arr[j-1]);
        }
    }
    for(int i=0; i<10; i++)
        cout << arr[i] << ' ';
    return 0;
}

교재 코드

#include <bits/stdc++.h>

using namespace std;

int n = 10;
int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

int main(void) {
    for (int i = 1; i < n; i++) {
        // 인덱스 i부터 1까지 감소하며 반복하는 문법
        for (int j = i; j > 0; j--) {
            // 한 칸씩 왼쪽으로 이동
            if (arr[j] < arr[j - 1]) {
                swap(arr[j], arr[j - 1]);
            }
            // 자기보다 작은 데이터를 만나면 그 위치에서 멈춤
            else break;
        }
    }
    for(int i = 0; i < n; i++) {
        cout << arr[i] << ' ';
    }
}

바로 앞의 값보다 작지 않으면 더 이상 살펴보지 않고 그 자리에 삽입하므로 정렬이 되어 있지 않은 경우 O(N^2)이지만 정렬이 된 최선의 경우 O(N)이다. 따라서 거의 정렬이 된 상태에서 입력이 주어진다면 여타 정렬보다 삽입 정렬을 사용하는 것이 좋다.

'컴퓨터과학(CS) > 알고리즘' 카테고리의 다른 글

이진 탐색(Binary Search)  (0) 2021.09.15
카운팅 정렬(Counting Sort)  (0) 2021.09.10
병합 정렬(MergeSort)  (0) 2021.09.08
최대공약수(GCD), 최소공배수(GCM) - 유클리드 호제법  (0) 2021.09.06
버블정렬  (0) 2021.08.31