关于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。

猜你喜欢

转载自blog.csdn.net/mzj_best/article/details/82665605
今日推荐