常见排序算法–直接插入法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 |
---|
第一步排序后 | 15 | 24 | 3 | 49 | 10 |
第二步排序后 | 3 | 15 | 24 | 49 | 10 |
第三步排序后 | 3 | 15 | 24 | 49 | 10 |
第四步排序后 | 3 | 10 | 15 | 24 | 49 |
//将每个数与前面数组依次比对,知道这个数排到合适的位置
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]}进行直接插入排序.过程如下图。
初始状态 | 12 | 35 | 20 | 67 | 3 |
---|
两个一组排序 | | | | | |
排序前 | 12 | | 20 | | 3 |
| | 35 | | 67 | |
排序后得到 | 3 | | 12 | | 20 |
| | 35 | | 67 | |
整理 | 3 | 35 | 12 | 67 | 20 |
一个一组进行排序 | | | | | |
排序前 | 3 | 35 | 12 | 67 | 20 |
排序后 | 3 | 12 | 20 | 35 | 67 |
代码如下
//分为两种情况,依次比较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];
}
}