[C言語]配列をソートして並び替えるには?

C言語

どうも、ちょげ(@chogetarou)です。

配列(array)をソートして並び替える方法を紹介します。

スポンサーリンク

昇順(小さい順)

インターフェース, インターネット, プログラム, ブラウザ, Www

配列(array)を昇順(小さい順)にソートして並び替えるには、for文を使います。

まず、for文で配列のインデックスをループします。

次に、ループ処理で、配列のループされていない範囲のインデックスをfor文でループします。

2つ目のfor文のループ処理で、「2つ目のfor文のループ変数のインデックスの要素」より「1つ目のfor文のループ変数のインデックスの要素」が大きい場合に条件分岐します。

そして、条件を満たす場合に、「1つ目のfor文のループ変数のインデックスの要素」と「2つ目のfor文のループ変数のインデックスの要素」を入れ替えます。

//myArray=対象の配列
int size = sizeof(myArray) / sizeof(myArray[0]); //配列の要素数
int x;
for (int i = 0; i < size; ++i)  //配列のインデックスをループ
{
    for (int j = i + 1; j < size; ++j) //配列でループされていない範囲のインデックスをループ
    {
        if (myArray[i] > myArray[j]) 
        {
               //要素の入れ替え
               x =  myArray[i];
               myArray[i] = myArray[j];
               myArray[j] = x;
        }
    }
}

上記の2つのfor文は、対象の配列を昇順にソートして並び替えます。

使用例

#include <stdio.h>

int main(void){
    
    int myArray[6] = { 10, 2, 5, 7, 9, 1 };
    int size = sizeof(myArray) / sizeof(myArray[0]);
    
    int x;
    for (int i = 0; i < size; ++i) 
    {
        for (int j = i + 1; j < size; ++j)
        {
            if (myArray[i] > myArray[j]) 
            {
                    x =  myArray[i];
                    myArray[i] = myArray[j];
                    myArray[j] = x;
            }
        }
    }
            
    
    for (int i = 0; i < size; i++) {
        printf("%d ", myArray[i]);
    }
    
    return 0;
}
出力:
1 2 5 7 9 10 

降順(大きい順)

配列(array)を降順(大きい順)にソートして並び替えるには、for文を使います。

まず、for文で配列のインデックスをループします。

次に、ループ処理で、配列のループされていない範囲のインデックスをfor文でループします。

2つ目のfor文のループ処理で、「2つ目のfor文のループ変数のインデックスの要素」より「1つ目のfor文のループ変数のインデックスの要素」が小さい場合に条件分岐します。

そして、条件を満たす場合に、「1つ目のfor文のループ変数のインデックスの要素」と「2つ目のfor文のループ変数のインデックスの要素」を入れ替えます。

//myArray=対象の配列
int size = sizeof(myArray) / sizeof(myArray[0]); //配列の要素数
int x;
for (int i = 0; i < size; ++i)  //配列のインデックスをループ
{
    for (int j = i + 1; j < size; ++j) //配列でループされていない範囲のインデックスをループ
    {
        if (myArray[i] < myArray[j]) 
        {
               //要素の入れ替え
               x =  myArray[i];
               myArray[i] = myArray[j];
               myArray[j] = x;
        }
    }
}

上記の2つのfor文は、対象の配列を降順にソートして並び替えます。

使用例

#include <stdio.h>

int main(void){
    
    int myArray[6] = { 10, 2, 5, 7, 9, 1 };
    int size = sizeof(myArray) / sizeof(myArray[0]);
    
    int x;
    for (int i = 0; i < size; ++i) 
    {
        for (int j = i + 1; j < size; ++j)
        {
            if (myArray[i] < myArray[j]) 
            {
                    x =  myArray[i];
                    myArray[i] = myArray[j];
                    myArray[j] = x;
            }
        }
    }
            
    
    for (int i = 0; i < size; i++) {
        printf("%d ", myArray[i]);
    }
    
    return 0;
}
出力:
10 9 7 5 2 1 

ランダム

配列(array)をシャッフルしてランダムに並び替えるには、フィッシャー–イェーツのシャッフルを使います。

まず、配列のインデックスをループします。

ループ処理で、rand()をループ変数に「+1」した値で割った余りで、ランダムなインデックスを生成します。

そして、「生成したランダムなインデックスの要素」と「ループ変数のインデックスの要素」を入れ替えます。

//myArray=対象の配列, T=要素の型
int n = sizeof(myArray) / sizeof(myArray[0]);
for (int i = n-1; i > 0; i--)
{
    //ランダムなインデックスを生成
    int j = rand() % (i + 1);
 
    //ランダムに入れ替える
    T temp = myArray[i];
    myArray[i] = myArray[j];
    myArray[j] = temp;
}

上記のループは、配列をシャッフルしてランダムに並び替えます。

使用例

#include <stdio.h>
#include <time.h>

int main(void){
    int nums[] = { 1, 2, 3, 4, 5 };
    int n = sizeof(nums) / sizeof(nums[0]);
    
    //乱数のシード設定
    srand ( time(NULL) );
 
    //配列をシャッフル
    for (int i = n-1; i > 0; i--)
    {
        int j = rand() % (i + 1);
 
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    
    for (int i = 0; i < n; i++) {
        printf("%d ", nums[i]);
    }
    
    return 0;
}

まとめ

配列(array)を昇順もしくは降順に並び替えるには、2重のループを使います。

また、配列をランダムに並び替えるには、ループとフィッシャー–イェーツのシャッフルを使います。

昇順に並び替える
int size = sizeof(myArray) / sizeof(myArray[0]);
int x;
for (int i = 0; i < size; ++i)
{
    for (int j = i + 1; j < size; ++j)
    {
        if (myArray[i] < myArray[j]) 
        {
               x =  myArray[i];
               myArray[i] = myArray[j];
               myArray[j] = x;
        }
    }
}
降順に並び替える
int size = sizeof(myArray) / sizeof(myArray[0]);
int x;
for (int i = 0; i < size; ++i)
{
    for (int j = i + 1; j < size; ++j)
    {
        if (myArray[i] < myArray[j]) 
        {
               x =  myArray[i];
               myArray[i] = myArray[j];
               myArray[j] = x;
        }
    }
}
ランダムに並び替える
int n = sizeof(myArray) / sizeof(myArray[0]);
for (int i = n-1; i > 0; i--)
{
    int j = rand() % (i + 1);
 
    T temp = myArray[i];
    myArray[i] = myArray[j];
    myArray[j] = temp;
}

コメント

タイトルとURLをコピーしました