카테고리 없음

[C/알고리즘] 선택 정렬 Selection Sort

미친토끼 2021. 3. 2. 12:13
//선택정렬 selectionSort.c

#include <stdio.h>
#include <stdlib.h>

// int형 두개를 맞바꿔주는 함수.
void int_swap(int *x, int *y) {
   int tmp = *x;
   *x = *y;
   *y = tmp;
}

// long int형 두개를 맞바꿔주는 함수.
void long_swap(long *x, long *y) {
   long tmp = *x;
   *x = *y;
   *y = tmp;
}

void printArray(int *array, int length) {

    for (int i = 0; i < length; i++) {
        printf("%ld\n", array[i]);
    }
    printf("\n");
}

void selectionSort(int *array, int length) {
    int min, min_idx, cur;

    //최소값 찾기
    for (int i = 0; i < length; i++) {
        min = array[i];  //배열의 첫번째 원소를 최소값으로 초기 설정.
        min_idx = i;   //그 인덱스는 0
        cur = i;    // 정렬 시작점. 처음은 0. 정렬이 하나씩 될수록 그 다음번 인덱스를 지목한다.
        for (int j = i; j < length; j++) { //i까지는 정렬되었으므로 그다음부터 시작.
            if (min > array[j+1]) { // 최소 설정값보다 작은 값을 만나면 그 값과 인덱스를 기록.
                min = array[j+1];
                min_idx = j + 1;
            }
        }
        //최소값이 있는 index와 현재 cur가 있는 지점의 데이터를 바꾼다.
        //최소값 인덱스와 현재 cur가 동일하다면 이미 정렬된 것이므로 데이터를 맞바꿀 필요가 없다.
        if (min_idx != cur)
            int_swap(&array[cur], &array[min_idx]);
        //printf("최소값 : %d, 위치 : %d\n", min, min_idx);
    }
}

int main (){
    
    //int array[] = {1, 10, 5, 3, 7};
    //int array[] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
    //const int length = sizeof(array) / sizeof(int);
    const int length = 1000;

    int *array = calloc(length, sizeof(int));
    for (int i = 0; i < length; i++)
        array[i] = rand();

    selectionSort(array, length);
    printArray(array, length);
    
    free(array);
    return 0;
}
----- 실행 결과----
2416949
6072641
6939507
7684930
8936987
10901063
11614769
11671338
12260289
12895151
14989683
19485054
..........
2114937732
2118421993
2130794395
2135019593
2137100237
2137390358
2142757034
2143124030
2145174067