C言語で行列の行を昇順に、列を降順にソートする方法を解説
問題概要
行列のすべての行を昇順に、すべての列を降順に並べ替えるコードを書きなさい。行列のサイズと要素は実行時にユーザーから入力として受け取るものとします。
解法
ここでは、C言語を使って行列の各行を昇順に、各列を降順に並べ替える方法を説明します。ポイントは、行のソートと列のソートでループの回し方と比較条件を切り替えることです。
行を昇順にソートするロジック
各行に対して隣接要素同士を比較し、前の要素が後ろの要素より大きければ交換する、という選択ソートの考え方を使います。
for (i=0;i<m;++i){
for (j=0;j<n;++j){
for (k=(j+1);k<n;++k){
if (ma[i][j] > ma[i][k]){
a = ma[i][j];
ma[i][j] = ma[i][k];
ma[i][k] = a;
}
}
}
}
外側のループ i が行を指定し、内側の二重ループ j と k がその行内の要素を比較します。ma[i][j] > ma[i][k] のときに値を交換することで、左から右へ小さい順に並んでいきます。
列を降順にソートするロジック
次に、列方向に対して同様の交換を行います。降順にするため、比較条件の不等号の向きを逆にしているのが特徴です。
for (j=0;j<n;++j){
for (i=0;i<m;++i){
for (k=i+1;k<m;++k){
if (mb[i][j] < mb[k][j]){
a = mb[i][j];
mb[i][j] = mb[k][j];
mb[k][j] = a;
}
}
}
}
この例では元の行列を配列 mb にコピーしておき、ma(行ソート済み)とは別に処理しています。こうすることで、行ソートの結果と列ソートの結果をそれぞれ独立に出力できます。
サンプルプログラム
以下が、行列のすべての行を昇順に、すべての列を降順に並べ替えるCプログラムの完全なコードです。
#include <stdio.h>
void main(){
int i,j,k,a,m,n;
static int ma[10][10],mb[10][10];
printf ("Enter the order of the matrix \n");
scanf ("%d %d", &m,&n);
printf ("Enter co-efficients of the matrix \n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
scanf ("%d",&ma[i][j]);
mb[i][j] = ma[i][j];
}
}
printf ("The given matrix is \n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",ma[i][j]);
}
printf ("\n");
}
printf ("After arranging rows in ascending order\n");
for (i=0;i<m;++i){
for (j=0;j<n;++j){
for (k=(j+1);k<n;++k){
if (ma[i][j] > ma[i][k]){
a = ma[i][j];
ma[i][j] = ma[i][k];
ma[i][k] = a;
}
}
}
}
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",ma[i][j]);
}
printf ("\n");
}
printf ("After arranging the columns in descending order \n");
for (j=0;j<n;++j){
for (i=0;i<m;++i){
for (k=i+1;k<m;++k){
if (mb[i][j] < mb[k][j]){
a = mb[i][j];
mb[i][j] = mb[k][j];
mb[k][j] = a;
}
}
}
}
for (i=0;i<m;++i){
for (j=0;j<n;++j){
printf (" %d",mb[i][j]);
}
printf ("\n");
}
}
プログラムの流れ
- ユーザーから行列の行数
mと列数nを入力してもらう。 - 行列の各要素を入力し、配列
maに格納すると同時にmbにもコピーする。 - 入力された元の行列を表示する。
maの各行を昇順にソートして表示する。mbの各列を降順にソートして表示する。
実行結果
上記のプログラムを実行すると、以下のような出力が得られます。
Enter the order of the matrix 3 4 Enter co-efficient of the matrix 1 2 3 4 1 2 3 4 5 1 2 3 The given matrix is 1 2 3 4 1 2 3 4 5 1 2 3 After arranging rows in ascending order 1 2 3 4 1 2 3 4 1 2 3 5 After arranging the columns in descending order 5 2 3 4 1 2 3 4 1 1 2 3
まとめ
このプログラムでは、同じ選択ソートの考え方を「行方向」と「列方向」の両方に応用しています。行ソートでは不等号を > にして昇順に、列ソートでは < にして降順にするだけで、目的の並べ替えが実現できる点がポイントです。計算量は O(m × n²) となるため、小規模な行列であれば十分実用的です。より大きなデータを扱う場合は、qsort関数などを活用すると効率よくソートできます。
-
Excelでセル・行・列を結合する方法|標準機能とCONCATENATE関数の使い方
Microsoft Excelで資料や表を作成していると、レイアウトを整えるためにセルを結合したい場面が出てきます。結合の方法はいくつかあり、用途に応じて使い分ければ、セルはもちろん行や列も自在にまとめられます。ただし、結合方法によってはセル内のデータの一部が失われることがあるため、操作前に最終的な見た目をイメージしておきましょう。 セルを結合する Excel標準の結合コマンドは、ホームタブの「配置」グループにまとめられています。 利用できる結合オプションは次の4種類です。 結合して中央寄せ:選択範囲を1つのセルにまとめ、文字列を中央に配置します。残るのは左端のセルの内容だけで
-
【Excel】行と列を固定(ウィンドウ枠の固定)する方法をわかりやすく解説
Microsoft Excelは、大量のデータを整理・分析できる表計算ソフトウェアです。小規模な事業から大規模な企業まで幅広く活用されており、財務分析などの業務にも欠かせないツールとなっています。ビジネス分析、人材管理、プロジェクト管理、戦略分析、運営管理、パフォーマンスレポート作成など、さまざまな用途に対応できる多機能性が魅力です。しかし、Excelが最もよく使われる場面は、やはりデータの保存と並べ替えによる効率的な分析です。 Microsoft Excel 2016および2019には、行や列を固定(フリーズ)する機能が搭載されています。この機能を使うと、シートを上下にスクロールしても、固定