C++排序函数汇总(附带实例)
排序算法用于对容器内容进行多种方式的排序。C++ STL 中提供的常见排序算法如下表所示。
下面通过实例介绍 sort(first, last)、partial_sort(first, middle, last) 和 merge(first, last, first2, last2, result) 这三个模板函数的用法。
【实例 1】使用 sort() 函数,对数据进行递增排序,具体代码如下:
【实例 2】使用 partial_sort() 函数,将一周日期排序输出,具体代码如下:
【实例 3】 使用 merge() 函数,将两个容器内的元素重新组合到另一个容器内,并输出,具体代码如下:
| 函数 | 说明 |
|---|---|
| sort(first, last) | 将指定区间内的元素排序,默认为升序 |
| stable_sort(first, last) | 将指定区间内的元素排序,值相同的元素不改变位置 |
| partial_sort(first, middle, last) | 将 [first, last) 区间内的元素排序,排序后一部分放至 [first, middle) 区间,其余放至 [middle, last) 区间 |
| partial_sort_copy(first, last, result_first, result_last) | 将 [first, last) 区间内的元素排序,排序后存入 [result_first, result_last) 区间 |
| is_sorted(first, last) | 判断指定区间是否已经排好序(默认为升序) |
| merge(first, last, first2, last2, result) | 把两个有序区间的元素合并,重新排序后放入 result 开始的序列 |
下面通过实例介绍 sort(first, last)、partial_sort(first, middle, last) 和 merge(first, last, first2, last2, result) 这三个模板函数的用法。
C++ sort(first,last)
该模板函数可将指定区间内的元素排序,只支持 array、vector、deque 这 3 类容器。函数原型如下:// 对指定区间内的元素排序,默认为升序排序 sort(first, last); // 对指定区间内的元素排序,compare 为排序规则 sort(first, last, compare);
【实例 1】使用 sort() 函数,对数据进行递增排序,具体代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Output(int val) { // 定义 Output() 函数
cout << val << ' ';
}
int main() {
vector<int> charVect;
// 向集合中添加 6 个元素
charVect.push_back('M'); // 77
charVect.push_back('R'); // 82
charVect.push_back('K'); // 75
charVect.push_back('J'); // 74
charVect.push_back('H'); // 72
charVect.push_back('I'); // 73
cout << "Vect : ";
for_each(charVect.begin(), charVect.end(), Output); // 输出排序前所有元素
cout << endl;
sort(charVect.begin(), charVect.end()); // 对集合中元素排序
cout << "Vect : ";
for_each(charVect.begin(), charVect.end(), Output); // 输出排序后所有元素
cout << endl;
return 0;
}
运行结果为:
Vect : 77 82 75 74 72 73
Vect : 72 73 74 75 77 82
C++ partial_sort(first,middle,last)
该模板函数可将 (first,last) 区间的元素排序,排序后一部分元素放至 (first,middle) 区间内,其余元素放至 (middle,last) 区间内。【实例 2】使用 partial_sort() 函数,将一周日期排序输出,具体代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
void Output(const string& val) { // 定义 Output() 函数
cout << val << endl;
}
int main() {
vector<string> strVect;
// 向集合中添加 7 个元素
strVect.push_back("Sunday");
strVect.push_back("Monday");
strVect.push_back("Tuesday");
strVect.push_back("Wednesday");
strVect.push_back("Thursday");
strVect.push_back("Friday");
strVect.push_back("Saturday");
cout << "Vect : ";
for_each(strVect.begin(), strVect.end(), Output); // 输出原始顺序
// 局部排序:仅将前 3 个最小元素排到最前面
partial_sort(strVect.begin(), strVect.begin() + 3, strVect.end());
cout << endl << "Vect : ";
for_each(strVect.begin(), strVect.end(), Output); // 输出排序后顺序
return 0;
}
运行结果为:
Vect : Sunday Monday Tuesday Wednesday Thursday Friday Saturday Vect : Friday Monday Saturday Wednesday Tuesday Thursday Sunday程序使用 partial_sort() 函数对 vector 容器内元素进行排序,将排序后的第 2~4 个元素放到容器的前一部分。
C++ merge(first,last,first2,last2,result)
该模板函数可把 (first,last) 区间和 (first2,last2) 区间的元素合并,重新排序后放至 result 开始的序列中。合并排序的前提是,两个待合并序列已排好序且排序规则相同,合并后默认仍使用该排序规则。【实例 3】 使用 merge() 函数,将两个容器内的元素重新组合到另一个容器内,并输出,具体代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
void Output(const string& val) { // 定义 Output() 函数
cout << val << endl;
}
int main() {
vector<string> strVect1;
vector<string> strVect2;
// 向 strVect1 中添加 4 个元素
strVect1.push_back("Sunday");
strVect1.push_back("Monday");
strVect1.push_back("Tuesday");
strVect1.push_back("Wednesday");
// 向 strVect2 中添加 4 个元素
strVect2.push_back("Thursday");
strVect2.push_back("Friday");
strVect2.push_back("Saturday");
strVect2.push_back("Over");
cout << "Vect1 :" << endl;
for_each(strVect1.begin(), strVect1.end(), Output); // 输出 strVect1 所有元素
cout << endl << "Vect2 :" << endl;
for_each(strVect2.begin(), strVect2.end(), Output); // 输出 strVect2 所有元素
// 先分别排序
sort(strVect1.begin(), strVect1.end());
sort(strVect2.begin(), strVect2.end());
// 合并两个有序区间到 strVect3
int size = strVect1.size() + strVect2.size();
vector<string> strVect3(size);
merge(strVect1.begin(), strVect1.end(),
strVect2.begin(), strVect2.end(),
strVect3.begin());
cout << endl << "Vect3 :" << endl;
for_each(strVect3.begin(), strVect3.end(), Output); // 输出合并后的所有元素
return 0;
}
运行结果为:
Vect1 :
Sunday
Monday
Tuesday
Wednesday
Vect2 :
Thursday
Friday
Saturday
Over
Vect3 :
Friday
Monday
Over
Saturday
Sunday
Thursday
Tuesday
Wednesday
ICP备案:
公安联网备案: