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

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 が行を指定し、内側の二重ループ jk がその行内の要素を比較します。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");
    }
}

プログラムの流れ

  1. ユーザーから行列の行数 m と列数 n を入力してもらう。
  2. 行列の各要素を入力し、配列 ma に格納すると同時に mb にもコピーする。
  3. 入力された元の行列を表示する。
  4. ma の各行を昇順にソートして表示する。
  5. 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関数などを活用すると効率よくソートできます。

  1. Excelでセル・行・列を結合する方法|標準機能とCONCATENATE関数の使い方

    Microsoft Excelで資料や表を作成していると、レイアウトを整えるためにセルを結合したい場面が出てきます。結合の方法はいくつかあり、用途に応じて使い分ければ、セルはもちろん行や列も自在にまとめられます。ただし、結合方法によってはセル内のデータの一部が失われることがあるため、操作前に最終的な見た目をイメージしておきましょう。 セルを結合する Excel標準の結合コマンドは、ホームタブの「配置」グループにまとめられています。 利用できる結合オプションは次の4種類です。 結合して中央寄せ:選択範囲を1つのセルにまとめ、文字列を中央に配置します。残るのは左端のセルの内容だけで

  2. 【Excel】行と列を固定(ウィンドウ枠の固定)する方法をわかりやすく解説

    Microsoft Excelは、大量のデータを整理・分析できる表計算ソフトウェアです。小規模な事業から大規模な企業まで幅広く活用されており、財務分析などの業務にも欠かせないツールとなっています。ビジネス分析、人材管理、プロジェクト管理、戦略分析、運営管理、パフォーマンスレポート作成など、さまざまな用途に対応できる多機能性が魅力です。しかし、Excelが最もよく使われる場面は、やはりデータの保存と並べ替えによる効率的な分析です。 Microsoft Excel 2016および2019には、行や列を固定(フリーズ)する機能が搭載されています。この機能を使うと、シートを上下にスクロールしても、固定