[C언어] 선택정렬(Selection Sort)
2020. 7. 13.

배열에서 가장 큰 값을 찾아 맨 뒤의 원소와 교환한다. 

맨 뒤의 원소를 제외하고 다른 원소들 중 가장 큰 값을 찾고 교환한다.

하나의 원소만 남을 때까지 반복한다.

1
2
3
4
5
6
7
8
for(i = 0; i < size - 1; i++){
    max_index = 0;
    for(j = 0; j < size - i; j++)
        if(a[max_index] <= a[j]){//큰수찾기
           max_index = j;
        }
    swap(a[max_index], a[size - 1 - i]);
}
cs

 

반대의 경우로 가장 작은 수를 배열의 처음으로 보내어 고정하는 방법도 있다.

1
2
3
4
5
6
7
8
for(i = 0; i < size - 1; i++){
    min_index = i;
    for(j = i; j < size; j++)
        if(a[min_index] >= a[j]){
            min_index = j;
        }
    swap(a[min_index], a[i]);
}
cs

 

응용 내림차순 정렬 (아래 코드와 반대의 경우로 작은 수를 배열 끝에 고정시키는 방법도 있다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void selection_Sort(int* a, int size)
{
    int i, j, max, maxIdx, temp;
 
    for (i = 0; i < size - 1; i++) {
        maxIdx = i;
        for (j = i; j <= size - 1; j++) {
            if (a[maxIdx] <= a[j]) {
                maxIdx = j;
            }
        }
        temp = a[i];
        a[i] = a[maxIdx];
        a[maxIdx] = temp;
    }
}
cs

 

코드짤때 계속 실수 했던 부분이 maxIdex초기화를 첫번째 for문 안에 해야하는걸 까먹어서 첫번째 루프말고 아무 동작도 일어나지 않는 경우가 발생했다.

 

myoskin