C ++ STL(14):一般的なソートアルゴリズム(sort、random_shuffle、merge、reverse)


0一般的に使用されるソートアルゴリズムの概要[sort、random_shuffle、merge、reverse]

アルゴリズムの紹介::
sortコンテナ要素を並べ替えます。
random_shuffle指定された範囲のコンテナ要素の場合順不同、つまり、シャッフルします。
mergeマージ2つのコンテナの要素は、新しいコンテナに格納されます。
reverse逆行するコンテナ要素。


1ソート[コンテナ要素をソート]

ロール:コンテナ要素をソートします。

注:sortアルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>

関数プロトタイプ
sort(iterator begin, iterator end, _Pred);

パラメータの::
beginイテレータ開始位置;
end:イテレータ終了位置;
_Predオプション、デフォルトの昇順ソート;カスタム照合を指定できます。
①通常のコールバック関数;
述語(戻り値の型がbool;
③匿名関数(ラムダ式)ファンクター
④組み込み関数オブジェクト/リレーション関数(bool greater<T>またはbool less<T>)。

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用sort算法

//回调函数
bool myCompare(int val1, int val2) {
    
    
	return val1 > val2;
}

//函数对象/仿函数
class MyCompare {
    
    
public:
	//重载函数调用运算符()
	bool operator()(int val1, int val2) {
    
    
		return val1 > val2;
	}
};

//sort排序
int main() {
    
    
	vector<int> v;

	v.push_back(9);
	v.push_back(1);
	v.push_back(7);
	v.push_back(6);
	v.push_back(3);

	//默认升序排序
	sort(v.begin(), v.end());
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//1 3 6 7 9

	/* 降序排序 */
	//1.回调函数实现降序排序
	sort(v.begin(), v.end(), myCompare);
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//9 7 6 3 1

	//2.仿函数实现降序排序
	sort(v.begin(), v.end(), MyCompare());
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//9 7 6 3 1

	//3.匿名函数(lambda表达式)实现降序排序
	sort(v.begin(), v.end(), [](int val1, int val2) {
    
    return val1 > val2; });
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//9 7 6 3 1

	//4.内建函数对象实现降序排序
	sort(v.begin(), v.end(), greater<int>());
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//9 7 6 3 1

	return 0;
}

2 random_shuffle [シャッフル:指定された範囲内のコンテナ要素をランダムに並べ替えます]

役割指定された範囲のコンテナ要素に対して順不同、つまり、シャッフルします。

注1:random_shuffleアルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
注2:ランダム性を確保するには、ヘッダーファイルをインクルードしinclude <ctime>乱数シードを追加する必要がありますsrand((unsigned int)time(NULL));

関数プロトタイプ
random_shuffle(iterator begin, iterator end);

パラメータの説明::イテレータの
begin開始位置
end;:イテレータの終了位置;

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用sort算法
#include <ctime>	//添加随机数种子

int main() {
    
    
	//添加随机数种子
	srand((unsigned int)time(NULL));

	vector<int> v;
	for (int i = 0; i < 10; i++) {
    
    
		v.push_back(i);
	}

	//0 1 2 3 4 5 6 7 8 9
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });

	//洗牌算法
	random_shuffle(v.begin(), v.end());

	//随机排序:6 9 1 4 3 2 0 5 7 8
	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });

	return 0;
}

3マージ【2つのコンテナの要素をマージして新しいコンテナに保存する】

役割マージ2つのコンテナの要素は、新しいコンテナに格納されます。

注1:mergeアルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>
注2:mergeアルゴリズムを使用する場合、2つのソースコンテナの要素秩序と一貫した秩序でなければなりません合併後、新しいコンテナ要素は整然としたままです。
注3:mergeアルゴリズムを使用する場合は、ターゲットコンテナである必要があります事前にメモリスペースを開放してくださいdest.resize(src1.size() + src2.size());など。それ以外の場合、実行時にプログラムがクラッシュします。

関数プロトタイプ
merge(iterator begin1, iterator end1, iterator begin2, iterator end2, iterator dest);

パラメータの::
begin1ソースコンテナの開始位置1イテレータ;
end1:1イテレータソースコンテナの終了位置;
begin2ソースコンテナの開始位置2イテレータ;
end2:ソースコンテナの終了位置2イテレータ;
destターゲットコンテナイテレータ開始位置。

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用merge算法

int main() {
    
    
	//合并的两个源容器必须有序,且顺序一致
	vector<int> src1;
	for (int i = 0; i < 5; i++) {
    
    
		src1.push_back(i);
	}

	vector<int> src2;
	for (int i = 5; i < 10; i++) {
    
    
		src2.push_back(i);
	}

	//合并前,需为目标容器提前分配内存空间
	vector<int> dest;
	dest.resize(src1.size() + src2.size());

	//merge合并
	merge(src1.begin(), src1.end(), src2.begin(), src2.end(), dest.begin());
	//0 1 2 3 4 5 6 7 8 9
	for_each(dest.begin(), dest.end(), [](int val) {
    
    cout << val << " "; });

	return 0;
}

4リバース【リバースコンテナエレメント】

役割逆行する容器元素。

注:reverseアルゴリズムを使用する場合は、ヘッダーファイルをインクルードする必要がありますinclude <algorithm>

関数プロトタイプ
reverse(iterator begin, iterator end);

パラメータの説明::イテレータの
begin開始位置
end;:イテレータの終了位置;

#include <iostream>
using namespace std;

#include <vector>
#include <algorithm>	//使用reverse算法

int main() {
    
    
	vector<int> v;

	v.push_back(9);
	v.push_back(1);
	v.push_back(7);
	v.push_back(6);
	v.push_back(3);

	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//9 1 7 6 3

	//反转容器的元素
	reverse(v.begin(), v.end());

	for_each(v.begin(), v.end(), [](int val) {
    
    cout << val << " "; });	//3 6 7 1 9

	return 0;
}

おすすめ

転載: blog.csdn.net/newson92/article/details/114242778