技事録

大学で人工知能の研究しています.

マージソート

久々にC言語つかいました.
院試勉強の一環ですが懐かしい...

#include <stdio.h>
#include <stdlib.h>

int *buff;

// 再帰呼び出し用
void __merge_sort ( int* a, int left, int right )
{
	if ( left < right )
	{
		int mid = ( left + right ) / 2;
        
		// 左半分ソートの再帰呼び出し
		__merge_sort ( a, left, mid );
		// 右半分ソートの再帰呼び出し
		__merge_sort ( a, mid+1, right );
        
		
		int i, j;
        
		// buffに左半分を順に保存
		for ( i = left; i <= mid; i++ )
			buff[i] = a[i];
		// buffに右半分を逆順に保存
		for ( j = right; i <= right; i++, j-- )
			buff[i] = a[j];
        
		i = left;
		j = right;
        
		int k;
        
		for ( k = left; k <= right; k++ )
			if ( buff[i] > buff[j] )
				a[k] = buff[j--];
			else
				a[k] = buff[i++];
	}
}

int merge_sort ( int* a, int size )
{
	if ( ( buff = calloc ( size, sizeof ( int ) ) ) == NULL )
		return -1;
    
	__merge_sort ( a, 0, size-1 );
    
	return 0;
}


int main ( void )
{
	int a[] = { 10, 20, 30, 5, 26, 2, 87, 12, 22, 7 };
	int size = sizeof ( a ) / sizeof ( a[0] );
    
	printf ( "ソート前の要素の表示\n" );
	for ( int i = 0; i < size; ++i )
	{
		printf ( "%d ", a[i] );
	}
	printf ( "\n" );
    
	merge_sort ( a, size );
	
	printf ( "ソート前の要素の表示\n" );
	for ( int i = 0; i < size; ++i )
	{
		printf ( "%d ", a[i] );
	}
	printf ( "\n" );
}