希尔排序的基础为插入排序,首先理一下插入排序的思路:
插入排序核心代码思想:
void insert_sort(int a[],int n)
{
int i,j;
for(i = 1; i < n; i++) // 从第二个元素开始标,进行n-1次循环
{
int tmp = a[i]; //将这个元素赋值给tmp
for(j = i; j > 0 && a[j-1] > tmp; j--) // 从这个元素开始向前比较,如果前面的元素大于tmp,则将前面的元素值赋给这个元素
{
a[j] = a[j-1];
}
a[j] = tmp; tmp的值赋给前一个元素的值,其实就是交换元素的值
}
}
希尔排序就是在插入排序基础上增加了一个增量序列,对于N个数据的数组,N个元素的序列,增量序列为N/2,N/2/2,......直到增量序列 = 1
每次循环,对每隔增量序列个元素进行插入排序,核心代码如下:
void shell_sort(int a[],int n)
{
int d,p,i;
for(d = n/2; d > 0; d = d/2) // 增量序列每次取 n/2
{
for(p = d; p < n; p++)
{
int tmp = a[p];
for(i = p; i >= d && a[i-d] > tmp; i = i-d) //对每隔d个元素的元素进行插入排序
{
a[i] = a[i-d];
}
a[i] = tmp;
}
}
}
希尔排序一次数据交换可能减少多个逆序对,从而提高效率,在某些情况下由于冒泡和插入