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