본문 바로가기

Code.D IT 프로젝트/C언어

[C언어 문제] 포인터를 이용해서 배열 요소 정렬(feat.swap)

C언어 문제

포인터를 이용해서 배열 요소 정렬



문제)

포인터를 이용해서 배열 요소를 정리하세요.

int array[10] = {8, 4, 6, 1, 2, 9, 3, 7, 5}



예상 출력 결과

정렬 전 배열 요소: 8 4 6 1 2 9 3 7 5

정렬 후 배열 요소: 1 2 3 4 5 6 7 8 9



포인터를 이용해서 배열의 요소를 오름차순으로 정렬해보겠습니다.



#include <stdio.h>

//외부 함수 ascend 선언 [Call by Reference(int* a) & Call by Value(int count)]
int ascend(int* a, int count);  

int main(void){

     //배열 선언 및 초기화
     int array[10] = {8, 4, 6, 1, 2, 9, 3, 7, 5 };   

      //배열의 전체 크기/자료형(int)의 크기
     int count = sizeof(array)/sizeof(int);  

      //ascend 함수 호출
     ascend(array, count);  

     return 0;

}

//외부 함수 정의(오름차순 정렬)
int ascend(int* a, int count){    
   
     int i,j; 
     int tmp;     //임시 저장 변수 선언

     for(i=0; i<count; i++){         
         for(j=i+1; j<count; j++){  
              if(*(a+i)>*(a+j)){     

              //*(a+i) 와 *(a+j) swap(변수 값 서로 교환)
              tmp = *(a+i);    
              *(a+i) = *(a+j);
              *(a+j) = tmp;
              }
         }
     }

     int num;     

     for(num=0; num<count; num++)      
   
         printf("array[%d]: %d \n", num, *(a+num));   

     return 0;    
}



다음은 출력 결과입니다.






외부 함수 ascend를 정의합니다.

if(*(a+i)>*(a+j)){

tmp = *(a+i);

*(a+i) = *(a+j);

*(a+j) = tmp;

→ 배열 요소 두 개의 값 *(a+i)와 *(a+j)를 서로 비교했을 때

*(a+i)의 값이 *(a+j)의 값보다 크다면 *(a+i)를 임시 저장하기 위해 선언한 변수인 tmp에 저장합니다.

그리고 *(a+i)와 *(a+j)의 값을 서로 Swap(교환) 해줍니다.

Swap 부분이 잘 이해가 안 되신다면 설명이 잘 되어 있는 아래 동영상을 참고하시기 바랍니다.







외부함수 ascend를 선언하고 메인(main)함수에서 호출합니다.

외부 함수 ascend에서 출력을 해주고 있어서 메인 함수에서 따로 출력함수(prinf)를 사용하지 않아도 출력됩니다.



참고

메인 함수에서 count는 배열의 전체 크기(4X10=40byte)/자료형(int)의 크기(4byte) = 10(배열 데이터값의 개수)입니다.