LoginSignup
0
0

More than 3 years have passed since last update.

C言語 ALDS1_2_C Stable Sort

Last updated at Posted at 2020-04-03

問題

コード

#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,イメージできた
    • 実装はまだ
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0