常见排序算法2–直接插入法vs希尔排序法

常见排序算法–直接插入法vs希尔排序法

首先,我们通过一个例子来了解直接插入算法

例如,对原始数组{15,24,3,49,10}进行直接插入排序(由小到大进行排序)

第一个数15无法比较,第二个数24与15比较,不做改变,第三个数3先后与24,15进行比较移到24的前面,第四个数49先后与24,15,3进行比较49不做改变,10分别与49,24,15,3相比,10移到3的前面。

如下

初始态数15数24数3数49数10
第一步排序后152434910
第二步排序后315244910
第三步排序后315244910
第四步排序后310152449
//将每个数与前面数组依次比对,知道这个数排到合适的位置
void insert(int a[],int n)
{
    for(i=1;i<n;i++)
    {
    //依次比对,直到该值大于数组中比较的值,后面的数组依次后移。
        for(j=i-1;j>=0;j--)
        {
            if(a[i]<a[j])
            {
                a[j+1]=a[j];
            }
            else
            {
                a[j+1]=a[i];
                break;
            }
        }
        if(j==-1&&a[i]<a[j+1])
            a[0]=a[i];//对(j==-1&&a[i]<a[j+1)进行单独分析
    }
}

希尔排序法:我们也通过一个例子来了解希尔排序法

如下一个无序数组(12 35 20 67 3)

首先进行第一次希尔排序,将数组每两个为一组,则{a[0],a[2],a[4]}为一大类进行直接插入排序,将{a[1],a[3]}为一类进行直接插入排序

然后进行第一次希尔排序,将数组每1个分为一组(就是直接插入排序),则{a[0],a[1],a[2],a[3],a[4]}进行直接插入排序.过程如下图。

初始状态123520673
两个一组排序
排序前12203
3567
排序后得到31220
3567
整理335126720
一个一组进行排序
排序前335126720
排序后312203567

代码如下

//分为两种情况,依次比较a[i]与a[j],a[j-k],a[j-2k],a[j-3k]...的值,直到a[i]>a[j]或者j<0;
void xier(int a[],int n,int v)//引入的v指的是分组的标准间隔,该算法表示经过一个间隔为k的希尔排序。
{
    for(i=v;i<n;i++)
    {
        j=i-v;
        while(a[j]>a[i]&&j>=0)
        {
            a[j+v]=a[j];
            j-=v;
        }
        a[i]=a[j+v];
    }
}
点赞