본문 바로가기
Do it 알고리즘 입문[C]

배열의 요소 역순으로 정렬하기

by 횰임 2022. 1. 17.

✅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