STL中常用的排序算法

merge()

  • 以下是排序和通用算法:提供元素排序策略
  • merge:    合并两个有序序列,存放到另一个序列。

例如:vecIntA,vecIntB,vecIntC是用vector<int>声明的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素

vecIntC.resize(9);  //扩大容量

merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());

此时vecIntC就存放了按顺序的1,2,3,4,5,6,7,8,9九个元素

sort()

  • sort:  以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。

//学生类

Class CStudent:

{

public:

        CStudent(int iID, string strName)

                 {

m_iID=iID; 

m_strName=strName;

}

public:           

        int m_iID;

        string m_strName;

}

 

//学号比较函数

bool Compare(const CStudent &stuA,const CStudent &stuB)

{

                 return (stuA.m_iID<strB.m_iID);

}

void main()

{

       vector<CStudent> vecStu;

       vecStu.push_back(CStudent(2,"老二"));

vecStu.push_back(CStudent(1,"老大"));

vecStu.push_back(CStudent(3,"老三"));

vecStu.push_back(CStudent(4,"老四"));

 

     sort(vecStu.begin(),vecStu.end(),Compare);

 

//  此时,vecStu容器包含了按顺序的"老大对象","老二对象","老三对象","老四对象"

}

random_shuffle()

  • random_shuffle:     对指定范围内的元素随机调整次序。

                 srand(time(0));                         //设置随机种子

 

                 vector<int> vecInt;

                 vecInt.push_back(1);

                 vecInt.push_back(3);

                 vecInt.push_back(5);

                 vecInt.push_back(7);

                 vecInt.push_back(9);

 

                 string str("itcastitcast ");

       

                 random_shuffle(vecInt.begin(), vecInt.end());   //随机排序,结果比如:9,7,1,5,3

                 random_shuffle(str.begin(), str.end());                //随机排序,结果比如:" itstcasticat "

reverse()

                 vector<int> vecInt;

                 vecInt.push_back(1);

                 vecInt.push_back(3);

                 vecInt.push_back(5);

                 vecInt.push_back(7);

                 vecInt.push_back(9);

 

                 reverse(vecInt.begin(), vecInt.end());              //{9,7,5,3,1}

具体代码如下:

#include <iostream>
using namespace std;
#include "string"
#include <vector>
#include <list>
#include "set"
#include <algorithm>
#include "functional"
#include "iterator"  //输出流迭代器的头文件

void printV(vector<int>& v1)
{
	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << endl;
	}
}

void merge()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector<int> v2;
	v2.push_back(2);
	v2.push_back(4);
	v2.push_back(6);

	vector<int> v3;
	v3.resize(v1.size()+v2.size());
	//合并两个有序序列,存放到另外一个序列
	merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
	printV(v3);  // 输出 1 2 3 4 5 6
}

class Student
{
public:
	Student(string name,int id)
	{
		m_name = name;
		m_id = id;
	}

	void printT()
	{
		cout << "name: " << m_name << " id " << m_id << endl;
	}

public:
	string m_name;
	int m_id;
};

//二元谓词
bool CompareS(Student &s1,Student &s2)
{
	return (s1.m_id<s2.m_id);
}

void sort()
{
	Student s1("老大",1);
	Student s2("老二",2);
	Student s3("老三",3);
	Student s4("老四",4);

	vector<Student> v1;
	v1.push_back(s4);
	v1.push_back(s1);
	v1.push_back(s3);
	v1.push_back(s2);

	for (vector<Student>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		it->printT();
	}

	//sort根据自定义函数对象,进行自定义数据类型的排序
	//替换算法的统一性,(实现的算法和数据类型的分离)==》技术手段函数对象
	sort(v1.begin(),v1.end(),CompareS);  //自定义排序,按照id从小到大
	cout << "排序后" << endl;

	for (vector<Student>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		it->printT();
	}
}

void shuffle()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);
    
	//随机打乱
	random_shuffle(v1.begin(),v1.end());
	printV(v1);

	string str = "abcdefg";
	random_shuffle(str.begin(),str.end());  
	cout << "str: " << str << endl;  //输出: facebgd
}

void reverse()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	//翻转
	reverse(v1.begin(),v1.end());
	printV(v1);  //输出: 7  5  3  1
}

void main()
{
	//merge();
	//sort();
	//shuffle();
	reverse();
}

 

 

发布了293 篇原创文章 · 获赞 113 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/tianguiyuyu/article/details/105626463