c++には便利なsort関数があります。
最近覚えたのでメモとして残します。
昇順、降順それぞれの記述方法と注意点です。
昇順ソート
vectorに詰まった数字のソートを行います。
昇順sort
sort(A.begin(), A.end());
降順ソート
続いて降順ソートです。
2通りどちらの書き方でも大丈夫です。
降順sort
//書き方1
sort(A.rbegin(), A.rend());
//書き方2
sort(A.begin(), A.end(), greater<int>());
部分ソート
配列を部分的にソートします。
以下は先頭から2要素目までを指定した部分ソートです。
部分sort
vector<int> A{3,1,4,2,5};
partial_sort(A.begin(), A.begin() + 2, A.end());
for(int i = 0; i < A.size(); i++){
cout << A[i] << " ";
}
result
1 2 4 3 5
注意しなければならないのは、「先頭から2つをソートする」ではなく「先頭から2要素が『配列全体をソートした結果』と同様になるような出力をする」であることです。
私は前者を期待していたために1時間ほど無駄にしました。
注意
//勘違いした私の期待(先頭から2要素だけソート)
3, 1, 4 , 2, 5 --> 1, 3, 4, 2, 5
//現実
3, 1, 4 , 2, 5 --> 1, 2, 4, 3, 5
先頭から任意の範囲だけソート
vectorは最初に宣言した大きさ以上に要素を詰め込むことができますが、あとから追加した要素については size() やend() が効きません(試してみた感じ多分)。
そのため、きちんと範囲の指定を行う必要があります。
私はこれに気づかずに無駄な時間を費やしたのですが、結果としてこれを利用して部分ソートでの私の失敗を解決することができました。
例)end()を使用
vector<int> A{3,1,4};
//要素をあとから追加
A[3]=2;
A[4]=5;
sort(A.begin(), A.end());
for(int i = 0; i < 5; i++){
cout << A[i] << " ";
}
結果
//先頭の3つのみソート実行
1 3 4 2 5
続いて範囲指定をしてソートを実行してみます。
例)begin()から範囲を指定
vector<int> A{3,1,4};
A[3]=2;
A[4]=5;
//先頭から数えて5つをソート
sort(A.begin(), A.begin() + 5);
for(int i = 0; i < 5; i++){
cout << A[i] << " ";
}
結果
1 2 3 4 5
全要素のソートができました。
以上参考まで。