【C++】配列の要素を大きい順に並べ替える(降順ソート)

昇順ソートと同様に、条件分岐で配列の要素 a[j] が a[j+1] よりも小さいときだけ入れ替えるという処理をN-1回繰り返すという方針で実装する。
※ N は配列の要素数

#include <iostream>
using namespace std;

int main() {
  int N;
  cin >> N;
  int a[110];
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }

  int tmp;
  for (int i = 0; i < N-1; ++i) {
    for (int j = 0; j < N-1; ++j) {
      if (a[j] < a[j+1]) {
        tmp = a[j];
        a[j] = a[j+1];
        a[j+1] = tmp;
      }
    }
  }

  for (int i = 0; i < N; ++i) {
    cout << a[i] << ' ';
  }
  cout << endl;

  return 0;
}

例えば、
        5
        3 1 4 1 5
を入力すると
        5 4 3 1 1
が出力される。
※入力の最初の1回は配列の要素数を入力する。

swap()関数を用いると、次のように書ける。

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

int main() {
  int N;
  cin >> N;
  int a[N];
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }

  for (int i = 0; i < N-1; ++i) {
    for (int j = 0; j < N-1; ++j) {
      if (a[j] < a[j+1]) {
        swap(a[j], a[j+1]);
      }
    }
  }

  for (int i = 0; i < N; ++i) {
    cout << a[i] << ' ';
  }
  cout << endl;

  return 0;
}

sort()関数を用いると、次のようにも書ける。

#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;

int main() {
  int N;
  cin >> N;
  int a[N];
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }
  
  sort(a,a+N, greater<int>());
  
  for (int i = 0; i < N; ++i) {
    cout << a[i] << ' ';
  }
  cout << endl;
  
  return 0;
}

また、sort()関数とreverse()関数を組み合わせると、次のようにも書ける。

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

int main() {
  int N;
  cin >> N;
  int a[N];
  for (int i = 0; i < N; ++i) {
    cin >> a[i];
  }
  
  sort(a, a+N);
  reverse(a, a+N);
  
  for (int i = 0; i < N; ++i) {
    cout << a[i] << ' ';
  }
  cout << endl;
  
  return 0;
}
タイトルとURLをコピーしました