关于STL的小结(持续更新中)

前言
最近又初学完了紫书第五章,特写此篇博客来作为一个小结,以备日后用来复习
———————————————————————————————————

正文

看完了紫书第五章,才发现自己的STL原来是这么薄弱。。
我们先一个一个说吧:

  • sort

sort是一个STL中所给出的一个排序的函数,其默认为从小到大的排序
使用语句

vector<int> v;//不定长数组
sort(v.begin(),v.end());//c++默认为左闭右开

由于STL中的sort只支持从小到大,固要想其实现从大到小,只能运用cmp

bool cmp(int a,int b)
{
	return a>b;
}
vector<int> v;
sort(v.begin(),v.end(),cmp);

通过实践我们发现
在有5e6个数,数据范围为1~1e8的时候
效率比较为
快排>sort>归并>希尔
但快排和sort的效率之间相差并不大~~(可能是我cpu太渣)~~
所以如果没有卡常需求的同学,用sort还是比较好的
下面附上时间比较的代码

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <algorithm>
#define random(a,b) (rand()%(b-a+1)+a)

using namespace std;

const int N=10000000+1;
int letter[N];
int letter2[N];
int letter3[N];
int letter4[N];
int r[N];

inline void _srand(int a,int b)//a:个数 b:范围
{
	srand((unsigned)time(NULL));
	for(int i=0; i<a; i++)
		letter[i]=random(1,b);
	for (int i=0; i<a; i++)
		letter2[i]=letter[i];
	for (int i=0; i<a; i++)
		letter3[i]=letter[i];
	for (int i=0;i<a;i++)
		letter4[i]=letter[i];
}

void guibing_sort(int a[],int s,int t)
{
	int m,i,j,k;
	if (s==t)
		return;
	m=(s+t)/2;
	guibing_sort(a,s,m);
	guibing_sort(a,m+1,t);
	i=s;
	j=m+1;
	k=s;
	while (i<=m&&j<=t)
	{
		if (a[i]<=a[j])
			r[k]=a[i],i++,k++;
		else
			r[k]=a[j],j++,k++;
	}
	while (i<=m)
		r[k]=a[i],i++,k++;
	while (j<=t)
	{
		r[k]=a[j];
		j++;
		k++;
	}
	for (i=s; i<=t; i++)
		a[i]=r[i];
}

void kuaipai_sort(int a[],int l,int r)
{
	int i,j,mid,p;
	i=l,j=r;
	mid=a[(l+r)/2];
	do
	{
		while (a[i]<mid)	i++;
		while (a[j]>mid)	j--;
		if (i<=j)
		{
			p=a[i];
			a[i]=a[j];
			a[j]=p;
			i++,j--;
		}
		
	}
	while (i<=j);
	if (l<j) kuaipai_sort(a,l,j);
	if (i<r) kuaipai_sort(a,i,r);
}

void xier_sort(int a[], int n)
{
	int i, j, gap;

	for (gap = n / 2; gap > 0; gap /= 2) //步长
		for (i = 0; i < gap; i++)        //直接插入排序
		{
			for (j = i + gap; j < n; j += gap)
				if (a[j] < a[j - gap])
				{
					int temp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > temp)
					{
						a[k + gap] = a[k];
						k -= gap;
					}
					a[k + gap] = temp;
				}
		}
}

int main()
{
	int a,b;
	cin>>a>>b;//数据个数,范围
	_srand(a,b);
	cout<<endl;

	clock_t time;
	time=clock();
	//sort_insert();
	guibing_sort(letter,1,a);
	time=clock()-time;
	cout<<"归并:"<<"Spend "<<(int)time<<" ms."<<endl;

	clock_t time1;
	time1=clock();
	kuaipai_sort(letter2,1,a);
	time1=clock()-time1;
	cout<<"快排: "<<"Spend "<<(int)time1<<" ms."<<endl;

	clock_t time2;
	time2=clock();
	xier_sort(letter3,a);
	time2=clock()-time2;
	cout<<"希尔:"<<"Spend "<<(int)time2<<" ms."<<endl;
	
	clock_t time3;
	time3=clock();
	sort(letter4,letter4+a);
	time3=clock()-time3;
	cout<<"sort: "<<"Spend "<<(int)time3<<" ms."<<endl;


	return 0;
}
  • set
    set是c++中的一个现成的容器,他可以实现排序+去重,默认为优先级从小到大,
    其具体操作为:
int a;
set <int> st;
st.insert(a);//在set中插入插入a这个元素
st.count(a);//在set中查找是否有a这个元素指向被搜索到的元素的迭代器,如果找不到,则返回指向末尾的迭代器。
for (set<int>::iterator it;it!=st.end();it++)
    cout<<*it<<" ";//遍历set中的元素
cout<<endl;

如果 set 对象是 const 限定的,函数返回类型为 const_iterator,否则返回 iterator。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值