C言語で1つの配列の前半を昇順・後半を降順にソートするプログラム
問題概要
要素数 N の1次元配列を受け取り、それを2つに分割するプログラムを作成します。その後、前半部分は昇順に、後半部分は降順にそれぞれソートして出力します。
解決の考え方
1つの配列に対して2つの異なる操作を行うには、配列を中央で分けた位置を基準に、ループの範囲を変えて処理します。まず b = n / 2 で境界位置を求め、インデックス 0〜b-1 を前半、b〜n-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 関数などの効率的なアルゴリズムの利用も検討しましょう。
-
C言語で配列を逆順に反転させるプログラムの書き方
配列とは、共通の名前のもとで管理される、関連性のあるデータ項目の集まりのことです。同じ型の複数の値を効率的に扱いたい場合に活用されます。配列の宣言構文C言語で配列を宣言する際の基本的な構文は以下のとおりです。データ型 配列名 [サイズ];配列の初期化配列は、宣言と同時に初期化することもできます。int a[5] = { 10,20,30,40,50};この例では、整数型の配列 a の5つの要素に、それぞれ10から50までの値が順番に格納されています。C言語で配列を逆順にする方法配列の要素を逆順に並べ替えるには、要素の入れ替え(スワップ)やコピーのテクニックを利用します。たとえば、4つの要素を持
-
Pythonで配列内の複数の数値の最大公約数(GCD)を求める方法
はじめに本記事では、Pythonを使って配列(リスト)内の2つ以上の数値から最大公約数(GCD:Greatest Common Divisor)を求める方法を解説します。問題の概要数値の配列が与えられ、そのすべての要素に共通する最大公約数を求めることが目的です。3つ以上の数値のGCDは、「引数として渡されたすべての数値に共通する素因数の積」として定義できます。また、隣り合う2つの数値のGCDを繰り返し計算していくことでも求められます。ここでは、後者のアプローチである「ペアごとのGCDを順番に計算する」方法を実装します。アルゴリズムの流れまず、リストの最初の2つの要素のGCDを計算します。次に、