Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で1つの配列の前半を昇順・後半を降順にソートするプログラム

問題概要

要素数 N の1次元配列を受け取り、それを2つに分割するプログラムを作成します。その後、前半部分は昇順に、後半部分は降順にそれぞれソートして出力します。

解決の考え方

1つの配列に対して2つの異なる操作を行うには、配列を中央で分けた位置を基準に、ループの範囲を変えて処理します。まず b = n / 2 で境界位置を求め、インデックス 0b-1 を前半、bn-1 を後半として扱います。

前半を昇順にソートするロジック

隣接する要素同士を比較し、大きい値を後ろへ入れ替える単純な選択ソート(バブルソート)を使います。

for (i = 0; i < b; ++i) {
    for (j = i + 1; j < b; ++j) {
        if (number[i] > number[j]) {
            a = number[i];
            number[i] = number[j];
            number[j] = a;
        }
    }
}

後半を降順にソートするロジック

比較条件を逆にするだけで、同じ仕組みで降順ソートが実現できます。

for (i = b; i < n; ++i) {
    for (j = i + 1; j < n; ++j) {
        if (number[i] < number[j]) {
            a = number[i];
            number[i] = number[j];
            number[j] = a;
        }
    }
}

ソート結果の出力

前半と後半をそれぞれ別のループで表示します。

  • 前半(昇順)の出力:
for (i = 0; i < b; ++i)
    printf("%d ", number[i]);
  • 後半(降順)の出力:
for (i = b; i < n; i++)
    printf("%d ", number[i]);

サンプルプログラム

以下が、1つの配列の前半と後半に異なるソートを適用するCプログラムの完全なコードです。

#include<stdio.h>

void main() {
    int i, j, a, n, b, number[30];

    printf("要素数Nを入力してください\n");
    scanf("%d", &n);

    b = n / 2;

    printf("数値を入力してください\n");
    for (i = 0; i < n; ++i)
        scanf("%d", &number[i]);

    /* 前半を昇順にソート */
    for (i = 0; i < b; ++i) {
        for (j = i + 1; j < b; ++j) {
            if (number[i] > number[j]) {
                a = number[i];
                number[i] = number[j];
                number[j] = a;
            }
        }
    }

    /* 後半を降順にソート */
    for (i = b; i < n; ++i) {
        for (j = i + 1; j < n; ++j) {
            if (number[i] < number[j]) {
                a = number[i];
                number[i] = number[j];
                number[j] = a;
            }
        }
    }

    printf("\n前半の数値(昇順)\n");
    for (i = 0; i < b; ++i)
        printf("%d ", number[i]);

    printf("\n後半の数値(降順)\n");
    for (i = b; i < n; i++)
        printf("%d ", number[i]);
}

実行結果

上記のプログラムを実行すると、以下のような結果が出力されます。

要素数Nを入力してください
10
数値を入力してください
20
34
23
11
45
56
78
98
76
54

前半の数値(昇順)
11 20 23 34 45
後半の数値(降順)
98 78 76 56 54

ポイントまとめ

  • 配列の分割は実際にメモリ上で分ける必要はなく、インデックスの範囲だけで論理的に扱えます。
  • 昇順と降順の違いは、比較演算子を > から < に変えるだけです。
  • この手法は選択ソートの一種で、計算量は O(n²) です。より大きなデータを扱う場合は qsort 関数などの効率的なアルゴリズムの利用も検討しましょう。
  1. C言語で配列を逆順に反転させるプログラムの書き方

    配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持

  2. Pythonで配列内の複数の数値の最大公約数(GCD)を求める方法

    はじめに本記事では、Pythonを使って配列(リスト)内の2つ以上の数値から最大公約数(GCD:Greatest Common Divisor)を求める方法を解説します。問題の概要数値の配列が与えられ、そのすべての要素に共通する最大公約数を求めることが目的です。3つ以上の数値のGCDは、「引数として渡されたすべての数値に共通する素因数の積」として定義できます。また、隣り合う2つの数値のGCDを繰り返し計算していくことでも求められます。ここでは、後者のアプローチである「ペアごとのGCDを順番に計算する」方法を実装します。アルゴリズムの流れまず、リストの最初の2つの要素のGCDを計算します。次に、