マージソート
久々に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" ); }