插入排序的几种写法及性能上的差别

偶然间翻到了《编程珠玑》,上面偏序的一章介绍到了插入排序,作者给出了三种不同的写法。虽然只是简单的小程序,不过却提示了一点程序优化的思路。
第一种如下:

for i=[1,n)
    for(j=i;j>0 && Array[j-1]>Array[j];j--)
    swap(j-1,j)

我以前看到一个代码优化的原则是 ,能不用函数就尽量别用,特别是一些比较小巧的函数。所以这里内层循环中的函数调用其实很没用必要的。
我们可以用下面的代码来代替swap调用。

t=Array[j];
Array[j]=Array[j-1];
Array[j-1]=t;

在我的电脑上,第二种方法的运行时间为45秒,第三种方法运行时间为134秒
到了这里又为下一步的加速提供了思路,在上面的函数体中,不断的给t赋予相同的值,Array[i]中的初始值,所以可以将给t赋值的语句和将t赋给其它值的语句移出循环,同时修改比较语句。如下:

for i=[1,n)
    t=x[i];
    for(j=i;j>0 && x[j-1]>t;j--)
    x[j]=x[j-1];
x[j]=t;

这种写法在我的电脑上,运行时间为0秒(时间太短,没显示出来)
所以可见,函数调用其实是很浪费时间的,特别是需要在一个程序中调用多次的函数,能写成内联的,尽量内联。
上面数组大小的维度为20W,类型为int型。下面是示例代码:

#include 
#include 
#include 

#define N 200000
template <typename T> class 
Insert_Sort{
    private:
        T Array[N];
        size_t Run_Time;
    public:
        //Init
        Insert_Sort(){
            int temp;
            for(int i=0;i//产生随机数并写入数组 
                temp=rand()%1000000;
                Array[i]=temp;
            }
        }
        void method_1();
        void method_2();
        void method_3();
        void swap(int a,int b){
            int temp=Array[a];
            Array[a]=Array[b];
            Array[b]=temp;
        }
        void print(){
            for(int i=0;istd::cout<std::endl; 
        } 
};
template <typename T> void Insert_Sort::method_1(){
    int i,j;
    clock_t start,end;
    start=clock();
    for(i=1;ifor(j=i;j>0 && Array[j-1]>Array[j];j--)
            swap(j-1,j);
    end=clock();
    std::cout<<"Method1 Run time: "<<(end-start)/CLK_TCK<<std::endl;
}
template <typename T> void Insert_Sort::method_2(){
    int i,j,temp;
    clock_t end,start;
    start=clock();
    for(i=1;ifor(j=i;j>0 && Array[j-1]>Array[j];j--)
        {
            temp=Array[j-1];
            Array[j-1]=Array[j];
            Array[j]=temp;
        }
    end=clock();
    std::cout<<"Method2 Run time: "<<(end-start)/CLK_TCK<<std::endl;
}
template <typename T> void Insert_Sort::method_3(){
    int i,j,temp;
    clock_t start,end;
    start=clock();
    for(i=1;ifor(j=i;j>0 && Array[j-1]>Array[j];j--)
            Array[j]=Array[j-1];
        Array[j]=temp;
    }
    end=clock();
    std::cout<<"Metho3 Run time: "<<(end-start)/CLK_TCK<<std::endl;
}

int main(void){
    Insert_Sort<int> ivec;

//  ivec.method_3();  //法3
//  ivec.method_2();  //法2
    ivec.method_1();  //法1      
}

以上

你可能感兴趣的:(C/C++)