希尔排序是针对插入排序的优化算法。它是缩少增量的算法,一开始增量从元素个数len/2的增量开始,然后缩小增量gap=gap/2,直到gap为1,最终完成序列排序。
一、图文介绍
我们还是使用数组【10,5,3,20,1],排序使用升序的方式,小的元素在前,大的元素在后:
1.1,内循环第一遍
初始增量为gap=length/2=5/2=2,所以我们第一遍数组第三元素(我们用a[2]表示,后面也是)和a【0】比对,a[3]和a[1]比对,a[4]和a[2]比对再与a[0]比对。
1.2,内循环第二遍
内循环第二部,增量变为gap=gap/2=2/2=1,这个时候就变成插入排序了,我们根据前面排序出来的结果,列出结果(插入排序前面我们有介绍,我们简单图陈列下过程):
第一次:
第二次:
第三次:
第四次:
二、算法实现
2.1,希尔排序
我们用c语言写一个希尔排序算法的函数:
int * shellSort(int *arr,int len)
{
int cur;
for(int gap = len/2; gap > 0; gap = gap/2)
{
for(int i = gap;i < len;i++)
{
int j = i;
cur = arr[i];
while(j - gap >= 0 && cur < arr[j - gap])
{
arr[j] = arr[j - gap];
j = j - gap;
}
arr[j] = cur;
}
}
return arr;
}
2.2,程序测试:
int main() {
int a[]={10,5,3,20,1};
int *p = shellSort(a,5);
printf("the array a after sort is ");
for(int i=0;i<5;i++){
printf("%d ", *(p++));
}
}