問題
コード
#include <stdio.h>
typedef struct
{
char mark;
char num;
} Card;
static void swap(Card *a, Card *b)
{
Card tmp = *a;
*a = *b;
*b = tmp;
}
static void print_array(Card array[], int array_len)
{
for (int i = 0; i < array_len; i++)
{
printf("%c%c", array[i].mark, array[i].num);
if (i != array_len - 1)
printf(" ");
}
printf("\n");
}
/* 選択ソート */
static void selection_sort(Card A[], int N)
{
int min_index;
for (int i = 0; i < N; i++)
{
min_index = i;
for (int j = i; j < N; j++)
if (A[j].num < A[min_index].num)
min_index = j;
if (i != min_index)
swap(&A[i], &A[min_index]);
}
print_array(A, N);
}
/* バブルソート */
static void bubble_sort(Card A[], int N)
{
for (int i = 0; i < N; i++)
for (int j = 0; j + 1 < N - i; j++)
if (A[j].num > A[j + 1].num)
swap(&A[j], &A[j + 1]);
print_array(A, N);
}
/* 安定性判定(A[]には必ずバブルソート済みの配列を入れる) */
static void isStable(Card A[], Card B[], int N)
{
for(int i = 0; i < N; i++)
if(A[i].mark != B[i].mark){
printf("Not stable\n");
return;
}
printf("Stable\n");
return;
}
int main(void)
{
int N;
char card[3];
Card A[36];
Card B[36];
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
scanf("%s", card);
A[i].mark = card[0];
A[i].num = card[1];
B[i] = A[i];
}
bubble_sort(A, N);
isStable(A,A,N);
selection_sort(B, N);
isStable(A,B,N);
return 0;
}
ポイント
安定なソートか、の判断は、安定なソート比べることでわかる。
今回の場合は、バブルソートと比べることで安定かどうかを判断した。
所感
- バブルソートの昇順と降順でfor文の条件のところが変わることの理解が甘かったので、手間取った。
- 構造体を使うのは思いつかなかった。
所要時間85分
【復習】
- 2020/04/05
- OK,イメージできた
- 実装はまだ