进来深陷数据结构的困扰啊,今天上午偶然看了插入排序,看了好几种算法,偶有小体会,写之于此!

1.直接插入排序

直接插入排序是一种简单的排序方法,几乎不用思考算法,很容易就能实现,当然,你脑子偷懒的代价就是这个代码效率很低,当然在数据很少的时候,是没有任何问题的,但是,即便如此,还是有一些可以探究的东西。我看过两个版本的代码,当然几乎没有区别,

template<class T>
void simpleInsertSort(T a[],int size)
{
    int k;
    T tmp;
    for(int j=1;j<size;j++)
    {
        tmp=a[j];
        for(k=j-1;tmp<a[k]&&k>=0;k--) a[k+1]=a[k];
        a[k+1]=tmp;
    }
}

这是一个版本的,还有另外一个版本:

void InsertSort(int *a,int length)
{
    int i,j;
    for(i=1;i<length;i++)
    {
        int key=a[i];
        for(j=i-1;j>=0;j--)
        {
            if(key>a[j])
                break;
            else
            {
                a[j+1]=a[j];
                a[j]=key;
            }
        }
    }
}

显然从整个来讲,从数组或是指针实现都是可以的,但是我们可以看到在内层循环里面,两者有细微的区别,前者并没有a[j]=key这样一条语句,我们来看,事实上,当我们跳出循环时得到的k+1,就是此时应该插入的位置,所以a[j]=key这样一条语句,虽然便于理解,但是浪费了时间,当然在数据量很少的时候,这样并没有区别,这是第一种算法的体会!