C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
配列の要素を、それらの要素の値の昇順📘や降順📘になるようにソート📘したいとします。
以下のような配列があるとして、
int array[] = {5, 4, 7, 2, 8, 7, 3};
昇順であれば {2, 3, 4, 5, 7, 7, 8} という順番に、降順であれば {8, 7, 7, 5, 4, 3, 2} という順番になるようにします。
標準ライブラリの std::sort関数(【標準ライブラリ】第22章)や、std::stable_sort関数(【標準ライブラリ】第22章)を使うのが簡単です。この方法は、配列だけでなく、コンテナ📘類でも使用できます。
速度面では std::sort関数の方が有利ですが、std::sort関数は安定(アルゴリズムとデータ構造編【整列】第0章)ではありません。使い方はどちらも同じです。
昇順にソートする場合は、以下のようにします。
#include <algorithm>
#include <iostream>
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))
namespace {
void printElems(const int* begin, const int* end)
{
for (const int* p = begin; p != end; ++p) {
std::cout << *p << std::ends;
}
std::cout << std::endl;
}
}
int main()
{
int array[] = {5, 4, 7, 2, 8, 7, 3};
std::sort(array, array + SIZE_OF_ARRAY(array));
(array, array + SIZE_OF_ARRAY(array));
printElems}
実行結果:
2 3 4 5 7 7 8
降順でソートしたい場合は、第3引数に std::greater を指定します。
#include <algorithm>
#include <functional>
#include <iostream>
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))
namespace {
void printElems(const int* begin, const int* end)
{
for (const int* p = begin; p != end; ++p) {
std::cout << *p << std::ends;
}
std::cout << std::endl;
}
}
int main()
{
int array[] = {5, 4, 7, 2, 8, 7, 3};
std::sort(array, array + SIZE_OF_ARRAY(array), std::greater<>());
(array, array + SIZE_OF_ARRAY(array));
printElems}
実行結果:
8 7 7 5 4 3 2
余計なバグを生む可能性を考えると、あまりはできませんが、性能上の問題等でやむを得ない場合には、自力でソートアルゴリズムを実装するという方法もあります。
ソートアルゴリズムにはいろいろな種類があるので、目的に合った性能を持ったアルゴリズムを比較・検討して、慎重に実装してください。基本的なソートアルゴリズムについては、アルゴリズムとデータ構造編を参照してください。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |