문제 정의
N개의 요소를 가진 1차원 배열을 입력받아 두 부분으로 나눈 뒤, 첫 번째 절반은 오름차순으로, 두 번째 절반은 내림차순으로 정렬하는 프로그램을 작성해 보겠습니다.
해결 방법
C 언어에서 하나의 배열을 두 절반으로 나누어 각각 다른 방식으로 정렬하는 핵심은 중간 지점을 기준으로 인덱스 범위를 나누는 것입니다. 변수 b = n/2를 사용하면 첫 번째 절반은 인덱스 0부터 b-1까지, 두 번째 절반은 인덱스 b부터 n-1까지 처리할 수 있습니다.
첫 번째 절반을 오름차순으로 정렬하는 로직
선택 정렬 방식으로 앞부분 요소들을 서로 비교하여 작은 값이 앞으로 오도록 교환합니다.
for (i=0; i<b; ++i){
for (j=i+1; j<b; ++j){
if (number[i] > number[j]){
a = number[i];
number[i] = number[j];
number[j] = a;
}
}
}두 번째 절반을 내림차순으로 정렬하는 로직
뒷부분 요소들은 비교 조건만 반대로 바꾸어 큰 값이 앞으로 오도록 교환합니다.
for (i=b; i<n; ++i){
for (j=i+1; j<n; ++j){
if (number[i] < number[j]){
a = number[i];
number[i] = number[j];
number[j] = a;
}
}
}배열을 나누어 출력하는 로직
- 첫 번째 절반(오름차순) 출력
for (i=0; i<b; ++i)
printf ("%d ",number[i]);
- 두 번째 절반(내림차순) 출력
for(i=b;i<n;i++)
printf("%d ",number[i]);
전체 예제 코드
다음은 단일 배열의 두 절반에 대해 서로 다른 정렬 연산을 수행하는 완전한 C 프로그램입니다.
#include<stdio.h>
void main(){
int i,j,a,n,b,number[30];
printf ("Enter the value of N\n");
scanf ("%d", &n);
b = n/2;
printf ("Enter the numbers \n");
for (i=0; i<n; ++i)
scanf ("%d",&number[i]);
for (i=0; i<b; ++i){
for (j=i+1; j<b; ++j){
if (number[i] > number[j]){
a = number[i];
number[i] = number[j];
number[j] = a;
}
}
}
for (i=b; i<n; ++i){
for (j=i+1; j<n; ++j){
if (number[i] < number[j]){
a = number[i];
number[i] = number[j];
number[j] = a;
}
}
}
printf (" The 1st half numbers\n");
printf (" arranged in asc\n");
for (i=0; i<b; ++i)
printf ("%d ",number[i]);
printf("\nThe 2nd half Numbers\n");
printf("order arranged in desc.order\n");
for(i=b;i<n;i++)
printf("%d ",number[i]);
}
실행 결과
위 프로그램을 실행하고 N값으로 10, 숫자 10개를 입력하면 다음과 같은 결과가 출력됩니다.
Enter the value of N
10
Enter the numbers
20
34
23
11
45
56
78
98
76
54
The 1st half numbers
arranged in asc
11 20 23 34 45
The 2nd half Numbers
order arranged in desc.order
98 78 76 56 54
정리
이 프로그램의 핵심 포인트는 다음과 같습니다.
b = n/2로 배열의 중간 지점을 계산하여 두 절반으로 나눕니다.- 첫 번째 절반은
number[i] > number[j]조건으로 오름차순 정렬합니다. - 두 번째 절반은
number[i] < number[j]조건으로 내림차순 정렬합니다. - 교환(swap)은 임시 변수
a를 이용해 세 단계로 수행됩니다.
이처럼 하나의 배열 안에서도 인덱스 범위만 잘 나누면 서로 다른 정렬 기준을 동시에 적용할 수 있습니다. N이 홀수인 경우에는 앞쪽 절반에 한 개 더 많은 요소가 배정된다는 점도 참고하세요.