✅point
맨 앞의 요소값과 맨 뒤의 요소값 교환 -> 하나씩 안쪽의 요소값 서로 변경(반복) ===> 역순으로 배치됨
*교환 횟수 = 요소개수/2 (나머지 버림->요소가 홀수인 경우 가운데 요소는 교환할 필요 없으니까)
✅값의 교환(swap)
임시변수 t 사용
x -> t; // 원래 x의 값을 t에 저장
y -> x; // y의 값을 x에 저장
t -> y; //t(원래x값)을 y에 저장
결과) x에는 y의 값이, y에는 x의 값이 저장됨
✅실습 2-7--배열의 요소를 역순으로 정렬
/*실습 2-7*/
/*배열 역순 출력*/
#include <stdio.h>
#include <stdlib.h>
#define swap(type, x, y) do{type t = x; x = y; y = t;} while(0)
//type형 x와 y값을 교환하는 함수를 함수형식 매크로로 지정함
/*역순 정렬 함수*/
void ary_reverse(int a[], int n)
{
int i;
for(i=0; i<n/2; i++) //swap횟수: n/2번
{
swap(int, a[i], a[n-i-1]); //각 양끝 요소 a[i]와 a[n-i-1]
}
}
int main()
{
int i;
int *array; //배열 이름
int n; //배열 크기
printf("요소 개수: ");
scanf("%d", &n);
array = calloc(n, sizeof(int)); //배열생성
printf("%d개의 정수입력\n", n);
for(i=0; i<n; i++)
{
printf("array[%d] = ", i);
scanf("%d", &array[i]); //요소 입력
}
ary_reverse(array, n); //역순정렬
printf("배열 요소를 역순으로 정렬했음\n");
for(i=0; i<n; i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
free(array); //배열 해제
}
✅함수 형식 매크로 swap을 do while로 정의한 이유
#define swap(type, x, y) do{type t = x; x = y; y = t;} while(0)
swap 사용할 때 뒤에 세미콜론(;) 붙여서 표현 가능함
(do{..}while() 끝에 원래 ;붙으니까 #define으로 정의할 땐 ;제외하고 나중에 사용할 때 ; 붙이면 됨)
for(i=0; i<n/2; i++)
{
swap(int, a[i], a[n-i-1]);
}
'Do it 알고리즘 입문[C]' 카테고리의 다른 글
배열 연습문제 Q1-Q4 (0) | 2022.01.17 |
---|---|
기수 변환 (0) | 2022.01.17 |
배열과 포인터 (0) | 2022.01.17 |
배열과 동적 메모리 할당 (0) | 2022.01.17 |
연습문제 Q16~Q18 (0) | 2022.01.17 |