常用的排序算法
merge(); 合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。
sort(); 以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作。
random_shuffle(); 对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作。
reverse(); 将指定范围内元素重新反序排序。
merge()函数
合并两个有序序列,存放到另一个序列中。
merage(begin1, end1, begin2, end2, begin3);
sort()函数
默认以升序的方式重新指定范围内元素。
如果想修改排序规则,可输入比较函数
sort(begin, end, 谓词);
random_shuffle()函数
对指定范围内的元素随机调整次序
random_shuffle(begin, end);
reverse()函数
反转指定范围内元素
reverse(begin, end);
下面是练习演示代码:
#include <iostream> #include <algorithm> #include <vector> #include <functional> #include <list> #include <string> #include <string.h> using namespace std; void show(int &value) { cout << value << " "; } void test_merge() { // 1 要合并的容器 必须是 已经排序的 // 2 目标容器 需要开辟空间 vector<int> vec1; vector<int> vec2; list<int> lst; for (int i = 0; i < 10; i++) { vec1.push_back(rand() % 20); vec2.push_back(rand() % 30); } sort(vec1.begin(), vec1.end(), less<int>()); sort(vec2.begin(), vec2.end(), less<int>()); for_each(vec1.begin(), vec1.end(), show); cout << endl; for_each(vec2.begin(), vec2.end(), show); cout << endl; lst.resize(vec1.size() + vec2.size()); merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), lst.begin()); for_each(lst.begin(), lst.end(), show); cout << endl; } class Student { public: Student() { this->name = NULL; this->id = 0; } Student(char* name, int id) { int len = strlen(name) + 1; this->name = new char[len]; strcpy(this->name, name); this->id = id; } Student(const Student & s) { int len = strlen(s.name) + 1; this->name = new char[len]; strcpy(this->name, s.name); this->id = s.id; } Student & operator=(const Student & s) { if (this->name != NULL) { delete[] this->name; this->name = NULL; this->id = 0; } int len = strlen(s.name) + 1; this->name = new char[len]; strcpy(this->name, s.name); this->id = s.id; return *this; } void display() { cout << "name " << this->name << ", " << "id " << this->id << endl; } ~Student() { if (this->name != NULL) { delete[] this->name; name = NULL; this->id = 0; } } int getId() { return id; } private: char * name; int id; }; class StudentCompare { public: bool operator()( Student & s1, Student & s2) { if (s1.getId() < s2.getId()) { return true; } else { return false; } } }; void showStudent(Student & s) { s.display(); } void test_sort() { Student s1("zhang3", 1); Student s2("zhang4", 2); Student s3("zhang5", 3); Student s4("zhang6", 4); Student s5("zhang7", 5); vector<Student> vecS; vecS.push_back(s5); vecS.push_back(s4); vecS.push_back(s1); vecS.push_back(s3); vecS.push_back(s2); for (vector<Student>::iterator it = vecS.begin(); it != vecS.end(); it++) { (*it).display(); } cout << endl; //StudentCompare comObj; //sort(vecS.begin(), vecS.end(), comObj); sort(vecS.begin(), vecS.end(), StudentCompare()); //swap s1 = s2 for_each(vecS.begin(), vecS.end(), showStudent); cout << endl; //for (vector<Student>::iterator it = vecS.begin(); it != vecS.end(); it++) { // (*it).display(); //} //cout << endl; } void test_random() { vector<int> vec1; for (int i = 0; i < 10; i++) { vec1.push_back(rand() % 20); } sort(vec1.begin(), vec1.end()); for_each(vec1.begin(), vec1.end(), show); cout << endl; //随机洗牌 random_shuffle(vec1.begin(), vec1.end()); for_each(vec1.begin(), vec1.end(), show); cout << endl; string str = "123456789"; random_shuffle(str.begin(), str.end()); cout << str << endl; } void test_reverse() { vector<int> vec1; for (int i = 0; i < 10; i++) { vec1.push_back(rand() % 20); } sort(vec1.begin(), vec1.end()); for_each(vec1.begin(), vec1.end(), show); cout << endl; reverse(vec1.begin(), vec1.end()); for_each(vec1.begin(), vec1.end(), show); cout << endl; } int main(void) { //test_merge(); //test_sort(); //test_random(); test_reverse(); return 0; }