MergeSort ( 병합정렬 )

2017. 3. 24. 14:51C Algorithm

void merge_sort_internal ( int arr[] , int temp[] , int start , int middle , int end ){

int i = 0 , j = 0 , k = 0 , t = 0 ;

i = start ; 

j = middle + 1;

k = start ;

while ( i <= middle && j <= end ){

if ( arr [ i ] <= arr [ j ] ){

temp [ k ] = arr [ i ] ;

i++;

}else if ( arr [ i ] > arr [ j ] ){

temp [ k ] = arr [ j ] ;

j++;

}

k++;

}


if ( i > middle ){                            // 두번째 배열에 남아있는 값 처리하기

for ( t = j ; t <= end ; t++){

temp [ k ] = arr [ t ];

k++;

}

}else if ( j > end ){                         //첫번째 배열에 남아있는 값 처리하기

for( t = i ; t <= middle ; t++){

temp [ k ] = arr [ t ] ;

k++;

}

}


for ( t = start ; t<= end ; t++){         // 실제배열에 대입

arr[ t ] = temp[t] ;

}


}


void merge_sort ( int arr[] , int temp[] , int start , int end ){

int middle = 0 ;


if ( start < end ) {                                // 배열의 요소가 1개면 실행하지않는 재귀함수

middle = ( start + end ) / 2 ;

merge_sort ( arr , temp , start , middle ) ;

merge_sort ( arr , temp , middle + 1 , end );

merge_sort_internal ( arr , temp , start , middle , end );

}

}


int main ( void ) {


int arr[] = { 100 , 65 , 36 , 73, 26 , 48 , 14 };

int temp[10];

int i = 0;


merge_sort( arr , 0 , 7 );


for ( i = 0 ; i < 8 ; i++){

printf("%d" , arr[i] );

}


return 0 ;

}


=> 오름차순 정렬되어 출력한다.