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

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

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

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

C++

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

Q&A

解決済

4回答

2240閲覧

偶数が先,奇数が後である昇順に並び変える

退会済みユーザー

退会済みユーザー

総合スコア0

ソート

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

C++

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

0グッド

0クリップ

投稿2020/02/06 08:54

1以上100未満の任意の自然数を10回入力して,これらの数字を偶数が先,奇数が後である昇順に並び替えるプログラムを作りたいです.
以下のような形式で作りたいです.コードをどのように書けばいいでしょうか?教えてください.よろしくお願いします.

C++

1#include <iostream> 2using namespace std; 3 4void main() { 5 int num[10]; 6 int i; 7 for (i = 0; i < 10; i++) { 8 cin >> num[i]; 9 } 10 //偶数が先の昇順に並び替える 11 12 13 14 for (i = 0; i < 10; i++) { 15 cout << num[i] << endl; 16 } 17}

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

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

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

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

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

guest

回答4

0

ベストアンサー

tiitoiさんのコードを参考にしながら、1以上100未満という条件を利用して、奇数なら100を足しておくという方法で書いてしました。

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4 5int main() 6{ 7 std::vector<int> arr(10); 8 for (auto &v : arr) { 9 int n; 10 std::cin >> n; 11 v = n + 100 * (n % 2); 12 } 13 std::sort(arr.begin(), arr.end()); 14 for (const auto &v : arr) 15 std::cout << (v < 100 ? v : v - 100) << " "; 16 std::cout << std::endl; 17 return 0; 18}

O(n*log(n))の計算量になるソート部分が単純な比較だけになるので、数が多い場合に有利になるような気がします。気がするだけですけど。

投稿2020/02/06 14:00

raccy

総合スコア21739

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

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

0

comp.cpp

c

1#include <algorithm> 2using namespace std; 3 4void show_data(int * data, int size, string message) { 5 cout << message << endl; 6 for (int i = 0; i < size; i++) { 7 cout << data[i] << " "; 8 } 9 cout << endl; 10} 11 12int main() { 13 int nums[10]; 14 int pos[2] = {0, 0}; // 奇数と偶数の数を数える 15 16 for (int i = 0; i < 10; i++) { 17 cin >> nums[i]; 18 pos[nums[i] % 2]++; 19 } 20 show_data(nums, 10, "入力データ"); 21 22 // 単純にソートする 23 std::sort(std::begin(nums),std::end(nums)); 24 show_data(nums, 10, "単純ソート "); 25 26 // 偶数を前に集める。 27 int sorted_nums[10]; // 結果を保持する配列 28 pos[1] = pos[0]; // 偶数を保持する開始位置 29 pos[0] = 0; // 偶数を保持する開始位置 30 for (int i = 0; i < 10; i++) { 31 int m = nums[i] % 2; 32 sorted_nums[pos[m]] = nums[i]; 33 pos[m]++; 34 } 35 show_data(sorted_nums, 10, "最終結果"); 36 return 0; 37}

実行例
イメージ説明

普通にソートしてから、その結果をあたまからなめていってデーの配置を変えていくという方法です。
for ループで、データの順番変更をかいていますが、
配列から偶数だけを抜き出す filter 結果 と 奇数だけを抜き出す filter 結果を 結合させるというように書くとスッキリします。

投稿2020/02/08 11:09

katoy

総合スコア22324

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

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

0

偶数を配列の前半に、奇数を配列の後半に読み込み、
それぞれをソートすればよいでしょう。

C++

1#include <iostream> // cin, cout, endl 2#include <algorithm> // sort 3using namespace std; 4 5int main() 6{ 7 int num[10], n, i = 0, j = 10; 8 while (i < j) { 9 cin >> n; 10 if (n & 1) num[--j] = n; 11 else num[i++] = n; 12 } 13 sort(num, num + i); 14 sort(num + j, num + 10); 15 for (i = 0; i < 10; i++) cout << num[i] << endl; 16}

投稿2020/02/06 16:14

kazuma-s

総合スコア8224

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

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

0

偶数が先,奇数が後である昇順 とのことなので、ソートする際の条件式を以下のようにすればよいと思います。

  1. a, b の一方が偶数で、もう一方が奇数の場合、すなわち、a % 2 != b % 2 の場合は、偶数を手前 a % 2 < b % 2 にする。

※ x が偶数なら2で割った余り x % 2 は0、x が奇数なら2で割った余り x % 2 は1になることを利用

  1. a, b の両方が偶数または奇数、すなわち、a % 2 == b % 2 の場合は、小さい数を手前 a < b にする。

ちなみに、C++ なら、C スタイルの配列ではなく、std::vector を使うことをおすすめします。

サンプルコード

cpp

1#include <algorithm> 2#include <iostream> 3#include <vector> 4 5void main() 6{ 7 std::vector<int> array(10); 8 for (auto &v : array) 9 std::cin >> v; 10 11 for (const auto v : array) 12 std::cout << v << " "; 13 std::cout << std::endl; 14 15 std::sort(array.begin(), array.end(), [](int a, int b) { 16 if (a % 2 != b % 2) 17 // a, b の一方が偶数で、もう一方が奇数の場合、偶数を手前にする。 18 // a=奇数、b=偶数なら、a % 2 == 1, b % 2 == 0 19 // a=偶数、b=奇数なら、a % 2 == 0, b % 2 == 1 20 return a % 2 < b % 2; 21 else 22 // a, b の両方が偶数または奇数の場合、昇順なので、小さい数を手前にする。 23 return a < b; 24 }); 25 26 std::cout << "after sort" << std::endl; 27 for (const auto v : array) 28 std::cout << v << " "; 29 std::cout << std::endl; 30} 31
1 2 3 4 5 6 7 8 9 10 after sort 2 4 6 8 10 1 3 5 7 9

投稿2020/02/06 10:26

編集2020/02/06 14:47
tiitoi

総合スコア21956

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

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

fana

2020/02/06 11:53

これは降順に見えます.
tiitoi

2020/02/06 14:50

修正しました。ご指摘ありがとうございます。 降順と昇順のどっちが大きい順だったかよく間違えてしまうんですよね。。。
fana

2020/02/07 02:08

値の列を階段に見立てたら昇り階段か下り階段か…って考えればよい……「ハズだったよな?(不安!)」ってなります.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問