希尔排序是插入排序的一种
即我们要将一个数组分割成多个组,然后我们在这个区间内使用插入排序,插入排序我们在这里就不做过多的介绍了
首先我们要知道这个组是怎么划分的,我们划分区间首先就要定步长
第一次的步长gap=length/2
第二次步长 gap=gap/2
直到gap<1时结束
所以我们将一个数组分成了gap个组,然后我们在这个组中排序
注意:我们划分的各中的元素是通过原数组下标找到的
代码如下:
#include<stdio.h>
void ShellSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0)return;
int nGap;//步长
int i;//组
int j;//有序的最后一个
int k;//无序的第一个
int temp;
//定步长
for(nGap = nLength/2;nGap >0;nGap/=2)
{
//按照步长进行分组
for(i = 0;i<nGap;i++)
{
//各组内插入排序
for(k = i+nGap;k<nLength;k+=nGap)
{
j = k-nGap;
temp = arr[k];
while(temp < arr[j] && j>=i)
{
arr[j+nGap] = arr[j];
j-=nGap;
}
//放入
arr[j+nGap] = temp;
}
}
}
}
int main()
{
int arr[] = {10,2,45,3,8,108,5,7};
ShellSort(arr,sizeof(arr)/sizeof(arr[0]));
int i;
for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}