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

C言語で配列内の重複要素を削除するプログラムの書き方

配列内に存在する同じ数値を削除し、一意な要素だけで構成される配列を作成する方法を紹介します。

重複要素を削除するロジック

配列内の重複要素を削除するための基本的な考え方は、外側のループで基準となる要素を選び、内側のループでその後ろにある要素と順番に比較します。同じ値が見つかったら、その位置以降の要素をひとつずつ左にシフトして上書きすることで、重複を取り除きます。具体的なロジックは以下の通りです。

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

処理のポイント

  • 三重のループ構造: 外側のループで各要素を基準にし、中間のループで後続要素との比較を行い、重複が見つかった場合は最も内側のループで要素を左へシフトします。
  • j-- の役割: シフト直後の位置には新しい値が入るため、j をひとつ戻して再チェックすることで、連続した重複にも対応できます。
  • number-- の役割: 配列の実効的なサイズをひとつ減らすことで、削除済みの要素が以降の処理や表示の対象外になります。

重複削除後の数値を表示するロジック

重複を削除したあとの配列は、更新された number を上限として、先頭から順に出力します。

for(i=0; i<number; i++){
    printf("%d ", a[i]);
}

完全なプログラム

以下は、配列内の重複要素を削除するCプログラムの全体像です。

#include<stdio.h>
#include<stdlib.h>

int main(){
    int a[50], i, j, k, count = 0, dup[50], number;

    printf("Enter size of the array\n");
    scanf("%d", &number);

    printf("Enter Elements of the array:\n");
    for(i=0; i<number; i++){
        scanf("%d", &a[i]);
        dup[i] = -1;
    }

    printf("Entered element are: \n");
    for(i=0; i<number; i++){
        printf("%d ", a[i]);
    }

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

    printf("\nAfter deleting the duplicate element the Array is:\n");
    for(i=0; i<number; i++){
        printf("%d ", a[i]);
    }
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

Enter size of the array
10
Enter Elements of the array:
1 1 2 4 3 5 6 5 7 1
Entered element are:
1 1 2 4 3 5 6 5 7 1
After deleting the duplicate element, the Array is:
1 2 4 3 5 6 7

この例では、入力された10個の要素のうち重複していた「1」と「5」が削除され、7個の一意な要素だけが出力されています。

計算量に関する補足

このアルゴリズムは三重のループを使用するため、時間計算量は O(n³) となります。要素数が多い配列では処理に時間がかかる可能性があるため、実務ではソートを組み合わせた手法やハッシュテーブルを利用したより高速なアプローチを検討するとよいでしょう。

  1. JavaScriptで配列の要素を同じ配列内に複製する方法

    JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont

  2. C++プログラム:配列内の各要素の最後の出現を相対的な順序で出力する方法

    配列 a[] が与えられたとき、リスト内の各要素について最後に出現したものだけを出力するのが本記事の目的です。ここでは単純に重複要素を削除するだけでなく、各要素が配列内で最後に出現したタイミングに基づき、元の相対的な順序を維持したまま出力する必要があります。例えば、6つの要素を持つ配列 {1, 3, 2, 3, 1, 2} には重複した値が含まれています。この場合、期待される結果は「3 1 2」になります。入力例と出力例Input: a[]={4,2,2,4,1,5,1} Output : 2 4 5 1この例では、「2」はインデックス2で最後に出現し、「4」はインデックス3、「5」はインデッ