序算法时间测试比较

之前介绍过常见的排序算法,可以查看这里

之前实现的代码都是针对int型的算法,现在我将代码改写成了模板,这样可以应用于常见的一些类型。

为了测试比较不同的排序算法,采用了两种计时方式。注意,下面的两段代码中,void(*_sort[])(T*,int) 是函数指针数组。

1. 采用clock函数,统计排序算法所使用的时钟数

代码如下:  

复制代码
template < class T>
void clock_test()
{
     void(*_sort[])(T*, int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
                           select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
                           merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
     int len= sizeof(_sort)/ sizeof(_sort[ 0]);
    clock_t start,finish;
     //     cout<<CLOCKS_PER_SEC<<endl;
    cout<< " 鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t "<<endl;
     int step= 100;
     for( int k= 100;k<= 100000;k+=step)
    {
         const  int N=k;
        T arr[N];
         double tm[N];
         //     srand(time(0));
         for( int i= 0;i<N;i++)
            arr[i]=rand()% 1000;
         for( int i= 0;i<len;i++) {
            start=clock();
            _sort[i](arr,N);
            finish=clock();
            tm[i]=(finish-start)* 1.0/CLOCKS_PER_SEC;
        }
        cout<<k<< ' \t ';
         for( int i= 0;i<len;i++)
            cout<<tm[i]<< ' \t ';
        cout<<endl;
    }
}
复制代码

部分测试输出如下:  

 

2. 利用ftime函数,具体介绍见这儿 

代码如下:

复制代码
template < class T>
void time_test()
{
     void(*_sort[])(T*, int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
                           select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
                           merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
     int len= sizeof(_sort)/ sizeof(_sort[ 0]);
     struct TIMEB ts1,ts2;
    time_t t_sec,t_ms,ti;
    cout<< " 鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t "<<endl;
     int step= 100;
     for( int k= 100;k<= 100000;k+=step)
    {
         const  int N=k;
        T arr[N];
         double tm[N];
         for( int i= 0;i<N;i++)
            arr[i]=rand()% 1000;
        cout<<k<< ' \t ';
         for( int i= 0;i<len;i++) {
            ftime(&ts1);
            _sort[i](arr,N);
            ftime(&ts2);
            t_sec=ts2.time-ts1.time;
            t_ms=ts2.millitm-ts1.millitm;
            ti=t_sec* 1000+t_ms;
            cout<<ti<< ' \t ';
        }
        cout<<endl;
    }
}
复制代码

部分测试输出如下: 

 

最终的全部代码如下:

复制代码
#include <iostream>
#include <iterator>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <list>
#include <sys/timeb.h>
#define TIMEB timeb
#define _FUNC cout<<__FUNCTION__<<endl
#define print(arr,n) copy(arr,arr+n,ostream_iterator<T>(cout," "));\
    cout<<endl;
using  namespace std;
const  char * const red =  " \033[0;40;31m ";
const  char * const green=  " \033[0;40;32m ";
const  char * const normal =  " \033[0m ";

template < class T>
void insert_sort(T a[], int n)
{
     for( int i= 1;i<n;i++) {
        T t=a[i];
         int j;
         for(j=i- 1;j>= 0&&a[j]>t;j--) {
                a[j+ 1]=a[j];
        }
        a[j+ 1]=t;
    }

}
template < class T>
void binary_insert_sort(T a[], int n){
     for( int i= 1;i<n;i++){
         int low= 0;
         int high=i- 1;
        T t=a[i];
         int mid;
         while(low<=high){
            mid=(low+high)/ 2;
             if(t<a[mid])
                high=mid- 1;
             else
                low=mid+ 1;
        }
         for( int j=i;j>mid;j--)
            a[j]=a[j- 1];
        a[low]=t;

    }
}
template < class T>
void shell_sort(T a[], int n)
{
     int gap=n/ 2;
     bool flag= true;
     while(gap> 1||flag)
    {
        flag= false;
         for( int i= 0;i+gap<n;i++)
             if(a[i]>a[i+gap])
            {
                swap(a[i],a[i+gap]);
                flag= true;
            }
         if(gap> 1)
            gap/= 2;
    }

}
template < class T>
void shell_sort2(T a[], int n){
     int gap=n/ 2;
     while(gap> 0){
         for( int i=gap;i<n;i++){
            T t=a[i];
             int j;
             for(j=i-gap;j>= 0&&a[j]>t;j-=gap)
                a[j+gap]=a[j];
            a[j+gap]=t;
        }
        gap/= 2;
    }
}
template < class T>
void select_sort(T a[], int n)
{
     for( int i= 0;i<n- 1;i++)
    {
        T min=a[i];
         int index=i;
         for( int j=i+ 1;j<n;j++)
             if(a[j]<min)
            {
                min=a[j];
                index=j;
            }
        swap(a[i],a[index]);
    }
}
template < class T>
void select_sort2(T a[], int n)
{
     for( int i=n- 1;i> 0;i--){
         for( int j= 0;j<i;j++)
             if(a[j]>a[i])
                swap(a[j],a[i]);
    }

}
template < class T>
void select_sort3(T a[], int n)
{
     bool flag= true;
     for( int i=n- 1;i> 0&&flag;i--){
        flag= false;
         for( int j= 0;j<i;j++)
             if(a[j]>a[i])
                swap(a[j],a[i]),flag= true;
    }

}
template < class T>
void adjust(T b[], int m, int n){
     int j=m;
     int k= 2*m;
     while(k<=n){
         if(k<n&&b[k]<b[k+ 1])
            k++;
         if(b[j]<b[k])
            swap(b[j],b[k]);
        j=k;
        k*= 2;
    }
}
template < class T>
void heap_sort(T a[], int n){
    T *b=a- 1;
     for( int i=n/ 2;i>= 1;i--)
        adjust(b,i,n);
     for( int i=n- 1;i>= 1;i--){
        swap(b[ 1],b[i+ 1]);
        adjust(b, 1,i);
    }
}
template < class T>
void bubble_sort(T a[], int n)
{
     for( int i=n- 1;i> 0;i--)
         for( int j= 0;j<i;j++)
             if(a[j]>a[j+ 1])
                swap(a[j],a[j+ 1]);

}
template < class T>
void bubble_sort2(T a[], int n)
{
     bool flag= true;
     for( int i=n- 1;i> 0&&flag;i--){
        flag= false;
         for( int j= 0;j<i;j++)
             if(a[j]>a[j+ 1])
                swap(a[j],a[j+ 1]),flag= true;
    }

}
template < class T>
void qsort(T a[], int l, int r){
    T pvt=a[(l+r)/ 2];
     int i=l,j=r;
     while(i<=j){
         while(a[i]<pvt)
            i++;
         while(a[j]>pvt)
            j--;
         if(i<=j){
             if(i!=j)
                swap(a[i],a[j]);
            i++;
            j--;
        }
    }
     if(j>l)
        qsort(a,l,j);
     if(i<r)
        qsort(a,i,r);
}
template < class T>
void quick_sort(T a[], int n){
    qsort(a, 0,n- 1);
}
template < class T>
void merge(T a[],T b[], int l, int m, int r){
     int i,j,k;
    i=l;
    j=m+ 1;
    k=l;
     while(i<=m&&j<=r){
         if(a[i]<a[j])
            b[k++]=a[i++];
         else
            b[k++]=a[j++];
    }
     while(i<=m)
        b[k++]=a[i++];
     while(j<=r)
        b[k++]=a[j++];
     for( int s=l;s<=r;s++)
        a[s]=b[s];
}
template < class T>
void msort(T a[],T b[], int l, int r){
     if(l<r){
         int m=(l+r)/ 2;
        msort(a,b,l,m);
        msort(a,b,m+ 1,r);
        merge(a,b,l,m,r);
    }
}
template < class T>
void merge_sort(T a[], int n){
    T *b= new T[n];
    msort(a,b, 0,n- 1);
    delete[] b;
}
template < class T>
void merge_pass(T x[],T y[], int s, int n){
     int i= 0;
     while(i+ 2*s- 1<n){
        merge(x,y,i,i+s- 1,i+ 2*s- 1);
        i+= 2*s;
    }
     if(i+s<n)
        merge(x,y,i,i+s- 1,n- 1);
     else
         for( int j=i;j<=n- 1;j++)
            y[j]=x[j];
}
template < class T>
void merge_sort2(T a[], int n){
    T *b= new T[n];
     int s= 1;
     while(s<n){
        merge_pass(a,b,s,n);
        s+=s;
        merge_pass(b,a,s,n);
        s+=s;
    }
    delete[] b;
}

template < class T>
void merge_sort3(T a[], int n){
    vector< int> st;
     for( int i= 0;i<n- 1;i++){
         if(a[i]>a[i+ 1])
            st.push_back(i);
    }
    st.push_back(n- 1);
    T *b= new T[n];
     int l,m,r;
    l= 0;
     if(!st.empty())
    {
        m=st.front();
        st.erase(st.begin());
    }
     while(!st.empty()){
        r=st.front();
        st.erase(st.begin());
        merge(a,b,l,m,r);
        m=r;
    }
    delete [] b;
}
template < class T>
void merge_sort4(T a[], int n){
     int *pos= new  int[n];
     int k= 0;
     for( int i= 0;i<n- 1;i++){
         if(a[i]>a[i+ 1])
            pos[k++]=i;
    }
    pos[k++]=n- 1;
    T *b= new T[n];
     int l,m,r;
    l= 0;
     int p= 0;
     if(p<k)
        m=pos[p++];
     while(p<k){
        r=pos[p++];
        merge(a,b,l,m,r);
        m=r;
    }
    delete [] b;
}
template < class T>
void rank(T arr[], int n, int r[])
{
     for( int i= 0;i<n;i++)
        r[i]= 0;
     for( int i= 1;i<n;i++){
         for( int j= 0;j<i;j++)
        {
             if(arr[j]<=arr[i])
                r[i]++;
             else
                r[j]++;
        }
    }
}
template < class T>
void rank_sort(T arr[], int n)
{
     int *r= new  int[n];
    rank(arr,n,r);
     for( int i= 0;i<n;i++)
    {
         while(r[i]!=i)
        {
            T t=r[i];
            swap(arr[i],arr[t]);
            swap(r[i],r[t]);
        }
    }
    delete[] r;
}
template < class T>
void rank_sort2(T a[], int n){
     int *r= new  int[n];
    rank(a,n,r);
    T *u= new T[n];
     for( int i= 0;i<n;i++)
        u[r[i]]=a[i];
     for( int i= 0;i<n;i++)
        a[i]=u[i];
    delete[] r;
    delete[] u;
}
int maxbits( int a[], int n){
     int d= 0;
     for( int i= 0;i<n;i++){
         int b= 1;
         int r=a[i];
         while(r/ 10> 0){
            b++;
            r/= 10;
        }
         if(d<b)
            d=b;
    }
     return d;
}
void radix_sort( int a[], int n){
     int d=maxbits(a,n);
     int *temp= new  int[n];
     int *count= new  int[ 10];
     int adix= 1;
     for( int b= 1;b<=d;b++){
         for( int i= 0;i< 10;i++)
            count[i]= 0;
         for( int i= 0;i<n;i++){
             int k=(a[i]/adix)% 10;
            count[k]++;
        }
         for( int i= 1;i< 10;i++)
            count[i]+=count[i- 1];
         for( int i=n- 1;i>= 0;i--){
             int k=(a[i]/adix)% 10;
            count[k]--;
            temp[count[k]]=a[i];
        }
         for( int i= 0;i<n;i++)
            a[i]=temp[i];
        adix*= 10;
    }
    delete[] temp;
    delete[] count;
}
void radix_sort2( int a[], int n){
     int bits=maxbits(a,n);
    list< int> x(a,a+n);
     int range= 10;
    vector<list< int> > bin(range);
    list< int> y;
    list< int>::iterator ite;
     int adix= 1;
     for( int i= 0;i<bits;i++){
         for(ite=x.begin();ite!=x.end();ite++){
             int d=(*ite/adix)% 10;
            bin[d].push_back(*ite);
        }   
        vector<list< int> >::iterator ite2;
        y.clear();
         for(ite2=bin.begin();ite2!=bin.end();++ite2){
             for(ite=ite2->begin();ite!=ite2->end();++ite)
                y.push_back(*ite);
            ite2->clear();
        }
        x=y;
        adix*= 10;
    }
     int i= 0;
     for(ite=x.begin();ite!=x.end();ite++)
        a[i++]=*ite;
}
template < class T>
void sort_test( void (*_sort)(T*, int)){
     const  int N= 10;
    T orig[N];
    T standard[N];
    T arr[N];
    srand(time( 0));
     for( int j= 0;j< 18;j++){
         for( int i= 0;i<N;i++)
            orig[i]=rand()% 100;
        cout<< " bef: ";
        print(orig,N);

        copy(orig,orig+N,standard);
        sort(standard,standard+N);
        cout<< " std: ";
        print(standard,N);

        copy(orig,orig+N,arr);
        _sort(arr,N);
        cout<< " aft: ";
        print(arr,N);
         if(equal(standard,standard+N,arr))
            printf( " %sOK%s\n ",green,normal);
         else
            printf( " %sNO%s\n ",red,normal);
    }

}
template < class T>
void clock_test()
{
     void(*_sort[])(T*, int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
                           select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
                           merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
     int len= sizeof(_sort)/ sizeof(_sort[ 0]);
    clock_t start,finish;
     //     cout<<CLOCKS_PER_SEC<<endl;
    cout<< " 鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t "<<endl;
     int step= 100;
     for( int k= 100;k<= 100000;k+=step)
    {
         const  int N=k;
        T arr[N];
         double tm[N];
         //     srand(time(0));
         for( int i= 0;i<N;i++)
            arr[i]=rand()% 1000;
         for( int i= 0;i<len;i++) {
            start=clock();
            _sort[i](arr,N);
            finish=clock();
            tm[i]=(finish-start)* 1.0/CLOCKS_PER_SEC;
        }
        cout<<k<< ' \t ';
         for( int i= 0;i<len;i++)
            cout<<tm[i]<< ' \t ';
        cout<<endl;
    }
}
template < class T>
void time_test()
{
     void(*_sort[])(T*, int)={insert_sort,binary_insert_sort,shell_sort,shell_sort2,select_sort,
                           select_sort2,select_sort3,heap_sort,bubble_sort,bubble_sort2,quick_sort,
                           merge_sort,merge_sort2,merge_sort3,merge_sort4,rank_sort,rank_sort2};
     int len= sizeof(_sort)/ sizeof(_sort[ 0]);
     struct TIMEB ts1,ts2;
    time_t t_sec,t_ms,ti;
    cout<< " 鐩存帴鎻掑叆\t鎶樺崐鎻掑叆\t甯屽皵鎺掑簭\t "<<endl;
     int step= 100;
     for( int k= 100;k<= 100000;k+=step)
    {
         const  int N=k;
        T arr[N];
         double tm[N];
         for( int i= 0;i<N;i++)
            arr[i]=rand()% 1000;
        cout<<k<< ' \t ';
         for( int i= 0;i<len;i++) {
            ftime(&ts1);
            _sort[i](arr,N);
            ftime(&ts2);
            t_sec=ts2.time-ts1.time;
            t_ms=ts2.millitm-ts1.millitm;
            ti=t_sec* 1000+t_ms;
            cout<<ti<< ' \t ';
        }
        cout<<endl;
    }
}
int main()
{
//     sort_test(radix_sort2);
//     clock_test<int>();
    time_test< int>();
}
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值