###実現したいこと
実数値のデータの中から大きい順、小さい順にデータを並べるということをしたいです。選択ソートを使います。
###試したこと
最小値が分かりやすいようにit_min
が表示されるようにしました。
###問題点
選択ソートは
data[0]と{data[0]~data[n-1]}の最小値を交換する。
data[1]と{data[1]data[n-1]}の最小値を交換する[10]の最小値になってしまいます。
...
というのをずっと続けていくものです。
auto it_min=std::min_element(data.begin(),data.end());
の部分で最小値を求めるのですが、これでは毎回配列のdata[0]data.begin()
をdata[0],data[1]...というように変えることはできないのでしょうか。data.begin()
はずっと不動でdata[0]しか見てくれないのでしょうか?
最大値の場合もそうです。。。
実行結果
データ数を入力してください: 10 実数値データを入力してください: 5 2 3 1 9 5 4 3 6 0 it_min=0 it_min=0 it_min=0 it_min=0 it_min=0 it_min=0 it_min=0 it_min=0 it_min=0 it_min=0 1番目に小さな値:2 2番目に小さな値:3 3番目に小さな値:1 4番目に小さな値:9 5番目に小さな値:5 5番目に大きな値:4 4番目に大きな値:9 3番目に大きな値:5 2番目に大きな値:2 1番目に大きな値:1
###コード
C++
1/*実数値のデータの中から大きい順、小さい順にデータを並べる*/ 2 3#include<iostream> 4#include<algorithm> 5#include<vector> 6#include<utility> 7 8int main() 9{ 10 int i; 11 int n; //データ数 12 std::cout<<"データ数を入力してください:\n"; 13 std::cin>>n; //10以上と仮定する 14 std::cout<<"実数値データを入力してください:\n"; 15 std::vector<double> data; 16 for(i=0;i<n;i++){ 17 int d; 18 std::cin>>d; 19 data.push_back(d); 20 } 21 22 //選択ソートの基本操作を5回繰り返す(最小値を求めて並べていく) 23 for(i=0;i<n;i++){ 24 auto it_min=std::min_element(data.begin(),data.end()); //最小値を指すイテレータ 25 std::cout<<"it_min="<<*it_min<<" "; 26 std::swap(data[i],*it_min); //二つの値の交換 27 } 28 29 std::cout<<"\n"; 30 //小さい順に表示 31 for(i=0;i<5;i++){ 32 std::cout<<i+1<<"番目に小さな値:"<<data[i]<<"\n"; 33 } 34 std::cout<<" \n"; 35 36 //上記の逆バージョン(最大値) 37 for(i=0;i<5;i++){ 38 auto it_max=std::max_element(data.begin(),data.end()); 39 std::swap(data[i],*it_max); 40 } 41 42 //大きい順に表示 43 for(i=5;i>0;i--){ 44 std::cout<<i<<"番目に大きな値:"<<data[i]<<"\n"; 45 } 46 47 return 0; 48}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/04 06:10