前言
最近又初学完了紫书第五章,特写此篇博客来作为一个小结,以备日后用来复习
———————————————————————————————————
正文
看完了紫书第五章,才发现自己的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。