質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3699閲覧

c++ 配列のソートの仕方がわかりませんので、ご教授ください。

fab5

総合スコア11

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/02/11 06:23

はじめまして。
プログラミングを、はじめて間もない初心者です。
行き詰ってしまった為、質問させていただきます。

c++で、配列内の任意のキー?でソートをしたいのですが、
上手くいきません。
いろいろなwebサイトを参考にし実装しましたが、ダメでしたので
ご教授ください。

以下、ソースコードになります。

// test02.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include<iostream>
#include<string>
using namespace std;

class Human{
private:
string name;
double height;
double weight;
int age;
int sex;

public:
//メンバ変数に値をセット
void set(string a, double b, double c, int d, int e){
this->name = a;
this->height = b;
this->weight = c;
this->age = d;
this->sex = e;
}

//メンバ変数から値をゲット
string getName(){return name;}
double getHeight(){ return height; }
int getAge(){ return age;}

//メンバ変数の値を出力する関数
void put_data(){
cout <<this->name << "" << this->height << "" << this->weight << "" << this->age << "" << this->sex << endl;
}
};

int main(){
int head_count =0; //管理人数を入力
int i; //ループ用

cout << "管理する人数を入力";
cin >> head_count;

//入力した数値分のオブジェクトを生成
Human *Data = new Human[head_count];

//入力した値を格納
string input_name;
double input_height;
double input_weight;
int input_age;
int input_sex;

for (i = 0; i < head_count;i++){
cout << "No"<< i + 1 <<" 名前を入力"<<endl;
cin >>input_name;
//ここで入力チェック

cout << "No" << i + 1 << " 身長を入力" << endl;
cin >> input_height;
//ここで入力チェック

cout << "No" << i + 1 << " 体重を入力" << endl;
cin >> input_weight;
//ここで入力チェック

cout << "No" << i + 1 << " 年齢を入力" << endl;
cin >> input_age;
//ここで入力チェック

cout << "No" << i + 1 << " 性別を入力 1->男 9=>女" << endl;
cin >> input_sex;
//ここで入力チェック

//オブジェクトに値を格納する関数を呼び出す
Data[i].set(input_name, input_height, input_weight, input_age, input_sex);
}

//入力結果を出力
//for (i = 0; i < head_count;i++){
//Data[i].put_data();
//}

//sort_code
//ソートしたい値を入力
//cout <<"名前=> 1\n 身長=>2\n 体重=>3\n 年齢=>4 "<<endl;
//cin >>sort_code;

//入力した人数分
int *number = new int[head_count];
memset(number,0,sizeof(number));

int j =0;
int temp =0;

//--ここからの処理がわかりません----------------------------------------------------------------------------
for (i = 0; i <= head_count - 1;i++){
for (j = head_count - 1; j > i; j--){
if (Data[j].getAge() < Data[j - 1].getAge()){

}

}
}

delete Data;
delete number;
return 0;
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

根本的な点についてはChironianさんがコメントされてるので単なる指摘を。

単一のインスタンスをnewで確保した場合はメモリーの解放は以下のようにします。

型名 *p = new クラス名();
delete p;

しかし配列としてnewした場合、メモリー領域を開放するには以下のようにする必要があります。

型名 *p = new 型名[N]
delete[] p; // delete p;ではNG

厳密にdeleteの使い分けをしないといけない点に注意しましょう。
これを知らずにプログラムを動かすと何故異常終了するかわからず非常に混乱すると思います。
転ばぬ先の杖としてコメントしてみました。

投稿2017/02/11 08:29

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fab5

2017/02/11 11:51

ご指摘有難うございます。 まだまだ、わからない事だらけの為、勉強になります。 delete以外にも、ご指摘ありましたら宜しくお願いします。
guest

0

ベストアンサー

こんにちは。

質問の意図が今ひとつ掴めません。

  1. ソート方法自体が分からないのでしょうか?

この場合、ソート・アルゴリズムの学習も目的に入ってますか? 標準ライブラリを用いてソートしても問題ないですか?

  1. ソート方法は分かるけど、キーを自由に指定する方法が分からないのでしょうか?

  2. numberは何に使うのでしょうか? ソート結果をnumberに入れる?

とりあえず2でnumberを使わないなら、sort_codeの値でswitch分岐し、それぞれの中で指定キーで大小判定を行い交換するかどうかのフラグを立てます。switch終了時、そのフラグが立っていたら、その2つを交換で良い筈です。
外れているようでしたら、補足情報をお願いします。


【追記】
総当りのソートですね。
単純にiを0からn-1未満、jをi+1からn未満で回してData[i]、Data[j]を比較し、data[i]のageの方が大きかったら、Data[i]とData[j]を交換すればOKです。

C++

1for (int i=0; i < head_count-1; ++i) 2{ 3 for (int j=i+1; j < head_count; ++j) 4 { 5 if (Data[i].getAge() > Data[j].getAge()) 6 { 7 Human temp=Data[i]; 8 Data[i]=Data[j]; 9 Data[j]=temp; 10 } 11 } 12}

Humanのインスタンス自体をソートするのは非効率ですが、まずは簡単確実な方法で実装を進めた方がよいと思います。(上記コードもデバッグまではしていません。バグがあったらデバッグはお願いします。)

その後、効率を上げる場合は最初にnumber[i]=i;としておき、Data[number[i]]でData配列をアクセスし、Data[i]とData[j]を交換する代わりに、number[i]とnumber[j]を交換することで代用することも考えられます。

それとKSwordOfHasteさんが指摘されている点も反映しておくことをお勧めします。
new 型[]した時は、delete[]です。セットで使いましょう。

投稿2017/02/11 07:16

編集2017/02/11 12:34
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fab5

2017/02/11 11:48

ご回答有難うございます。 以下について、回答します >1.ソート方法自体が分からないのでしょうか?  まずは、ライブラリを使わないでソートし、出来ましたら使おうと思っております。 >2.ソートキーについて  まずは、int型ageのソートが出来ましたら、入力キーでソートキーを変更しようと思っています。 >3.numberは、ageをソートした順に代入したのち、その代入した値と一致した、Dataオブジェクト順に取得しようと、思い一時的に作成しました。考え方がズレていましたら、他の技法をご教授していたたけましたら幸いです。 よろしくお願いします。
Chironian

2017/02/11 12:20

なるほど。それでしたら、まずはソートに絞りましょう。
fab5

2017/02/11 13:44

下記ソースでソートが出来ました。 ご回答大変有難うございました。  後は、ソートしたい入力キーに合わせ、if分の条件式をすれば可能かなと・・・ 一時的な変数が、増えて少しカッコ悪いのですが、 プロの方でしたらどのようにソースで実装するの参考まで教えていただけないでしょうか? //ソース/////////////////////////////////////// for (int i = 0; i < head_count - 1; ++i){ for (int j = i + 1; j < head_count; ++j){ if (Data[i].getAge() > Data[j].getAge()){ temp_name = Data[i].getName(); temp_height = Data[i].getHeight(); temp_weight = Data[i].getWeight(); temp_age = Data[i].getAge(); temp_sex = Data[i].getSex(); Data[i].set(Data[j].getName(), Data[j].getHeight(), Data[j].getWeight(), Data[j].getAge(), Data[j].getSex()); Data[j].set(temp_name, temp_height,temp_weight,temp_age,temp_sex); } } }
Chironian

2017/02/11 14:44

メンバを1つ1つコピーしているとバグも発生しやすいですので、回答欄に書いた通り纏めてコピーした方がよいだろうと思います。 Humanは全てのメンバが単純コピーに対応しており、かつ、特殊なことをやっていないので、Humanも単純にコピーできます。
episteme

2017/02/11 23:23

> プロの方でしたらどのようにソースで実装する... プロなら"書かない"。ライブラリに任す。 std::sort(Data, Data+head_count,[](const Human& a, const Human& b) { return a.getAge() < b.getAge(); });
fab5

2017/02/13 06:56

episteme さん ご回答ありがとうございます。 なるほどぁ、そうでしたかぁ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問