4

各行で左から右に、または各列で上から下に読み取られたときに要素が昇順になるように、C++ で qsort または std::sort を使用して 2D 配列をソートすることは可能ですか?

例えば、

13, 14, 15, 16
1, 4, 3, 2
7, 5, 7, 6
9, 10, 11, 12

なる:

{ 1, 2, 3, 4 }
{ 5, 6, 7, 8 }
{ 9, 10, 11, 12 }
{ 13, 14, 15, 16 } 

2 つの比較関数を作成し、最初に各行を並べ替えてから、各行の最初の要素を比較して列を確立することで実行できることはわかっていますが、1 つの関数自体でそれを行う方法はありますか?

4

5 に答える 5

3
# include <iostream>
using namespace std ;


void swap (int &x , int &y)
{
    int temp = x ;
    x = y ;
    y = temp ;
}

void main ()
{
    int arr [3][3] = {{90,80,70},{60,50,40},{30,100,10}} ;
    int x ;

    for (int k = 0; k < 3; k++)
    {
        for (int m = 0; m < 3; m++)
        {
            x = m+1;
            for (int i = k; i < 3 ; i++)
            {
                for (int j = x; j < 3; j++)
                {
                    if (arr [k][m] > arr [i][j])
                        swap(arr [k][m] ,arr [i][j]);
                }
                x=0;
            } 
        }
    }

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            cout << arr [i][j] << " ";
        }
    }


    system("pause");
}

C++ 2次元配列の昇順ソート

于 2014-05-12T23:55:13.087 に答える
3

はい。C++ STL ライブラリは、アルゴリズムコンテナーを分離して構築されています。それらを結び付けるのがiteratorです。生のポインタはiteratorであるため、ベクトルを生のポインタで初期化し、そのベクトルを通常どおりソートすることができます。

std::vector<int> v(arr2d, arr2d + N); // create a vector based on pointers
                                      // This assumes array is contiguous range 
                                      // in memory, N=number of elemnts in arr2d
// using default comparison (operator <):
std::sort (v.begin(), v.end());

// cout by 4 elements in a row
于 2013-10-08T01:32:13.453 に答える
1

最初に 2D ベクトルを作成します。

この 2D ベクトルの各ベクトルを並べ替えます

ベクトル全体を並べ替える

コード :

#include <iostream>
#include <vector>
#include <algorithm>

template <class T>
void Sort2dArray(std::vector<std::vector<T>> & numbers)
{

    for(auto & i : numbers){//sort each vector<T> in numbers
        std::sort(i.begin(),i.end());
    }
    std::sort(numbers.begin(),numbers.end(),[](//sort numbers by defining custom compare 
              const std::vector<T>& a,const std::vector<T>&b){
        for(int i=0;i<a.size()&&i<b.size();i++)
        {
            if(a[i]>b[i])
                return false;
            else if(a[i]<b[i])
                return true;
        }
        return a.size()<b.size() ? true : false;
    });
}

int main()
{
    std::vector<std::vector<int>> numbers={ {13, 14, 15, 16},
                                            {1, 4, 3, 2},
                                            {8, 5, 7, 6},
                                            {9, 10, 12,11}};
    Sort2dArray(numbers);//sort array

    //write sorted array
    for(auto i:numbers)
    {
        for(auto j:i)
            std::cout<<j<<" ";
        std::cout<<"\n";
    }
}
于 2014-05-29T15:14:04.130 に答える
1

理論的には、16 個の数値を配列に入力できるはずです。数値を並べ替えるには、 for ループ (ネストされたループも使用できます) を使用します。次に、出力に関しては、昇順の数字を 4 つのグループに分けて表示しますか?

cout<<Vector[0]<<Vector[1]<<Vector[2]<<Vector[3]<<endl;
cout<<Vector[4]<<Vector[5]<<Vector[6]<<Vector[7]<<endl;
cout<<Vector[8]<<Vector[9]<<Vector[10]<<Vector[11]<<endl;
cout<<Vector[12]<<Vector[13]<<Vector[14]<<Vector[15]<<endl;

非常に恣意的ですが、質問がよくわかりません。

于 2013-10-08T02:13:06.817 に答える
-1

**C++ での 2D 配列のソート**

#include <iostream>

using namespace std;

int main()
{
    int i,j,k,m,temp,n,limit;
    int** p;


    cout<<"Enter the limit:";
    cin>>limit;

    p=new int*[limit];

//inputing
    for(i=0;i<limit;i++)
    {
        p[i] = new int[limit];

        for(j=0;j<limit;j++)
        {
          cin>>p[i][j];
        }

    }

//sorting
    for(i=0;i<limit;i++)
    {
        for(j=0;j<limit;j++)
        {
            if (j==limit-1 && i<limit-1)
            {
                n =-1;
                m=i+1;
            }
            else
            {
                m=i;
                n=j;
            }

            for(k=n+1;k<limit;k++)
            {
                if(p[i][j] > p[m][k] )
                {
                    temp = p[i][j];
                    p[i][j] = p[m][k];
                    p[m][k] = temp;
                }

                if(k==limit-1 && m<limit-1) { m++;  k=-1;  }

            }
        }
    }

    //displaying
    for(i=0;i<limit;i++)
    {
        for(j=0;j<limit;j++)
        {
            cout<<p[i][j]<<endl;
        }

    }

    return 0;
}
于 2014-01-19T12:55:20.620 に答える