#include #include #define MAX 52 struct CARD_T { char suit; int num; int key; }; typedef struct CARD_T card_t; void merge(card_t array[], int s1, int e1, int s2, int e2) { card_t tmp[MAX / 2 + 1]; int i, j, k; /* tmpにコピー */ for (i = 0; i <= e1 - s1; i++) { tmp[i] = array[s1 + i]; } for (i = 0, j = s2, k = s1; i <= e1 - s1 && j <= e2;) { if (tmp[i].key < array[j].key) { array[k++] = tmp[i++]; } else { array[k++] = array[j++]; } } /* 余りの処理 */ while (i <= e1 - s1) { array[k++] = tmp[i++]; } } void sort(card_t array[], int start, int end) { int half; if (start >= end) { return; } half = start + (end - start) / 2; sort(array, start, half); sort(array, half + 1, end); merge(array, start, half, half+1, end); } int main(int argc, char *argv[]) { int i, seed; char suit[4] = {'C', 'D', 'H', 'S'}; card_t ar[MAX]; if (argc <= 1) { printf("引数が足りません\n%s 乱数の種\n", argv[0]); return 1; }; for (i = 0; i < MAX; i++) { ar[i].suit = suit[i/13]; ar[i].num = i % 13 + 1; } for (i = 0; i < MAX; i++) { printf("%c%-2d ", ar[i].suit, ar[i].num); if (i % 13 == 12) { printf("\n"); } } seed = strtol(argv[1], NULL, 10); srandom(seed); for (i = 0; i < MAX; i++) { ar[i].key = random(); } printf("配列に乱数をセットしました。\n"); sort(ar, 0, MAX - 1); printf("配列をソートしました。\n"); for (i = 0; i < MAX; i++) { printf("%c%-2d ", ar[i].suit, ar[i].num); if (i % 13 == 12) { printf("\n"); } } return 0; }