希尔排序的基本思想:
把待排序的数据元素分成若干个小组,对同一个小组内的数据元素用直接插入法排序;小组的个数逐次缩小,当完成了所有的数据元素都在同一个小组内的排序后,排序过程结束。希尔排序又称为缩小增量排序。
希尔排序的过程图:

总结:希尔排序就通过缩小增量使得,数据逐渐变得有序,直到增量d=1,使得数据变得完全有序。
完整代码:
#include<stdio.h>
#include<iostream>
using namespace std;
///希尔排序为了克服相邻元素交换的次数(减少逆序对)---是对直接插入排序的优化
void shell(int *arr,int n,int width)
{
int i=width;
int j;
for(;i<n;++i)
{
int tmp=arr[i];
for(j=i-width;j>=0;j-=width)
{
if(arr[j]>tmp)
{
arr[j+width]=arr[j];
}
else
{
break;
}
}
arr[j+width]=tmp;
}
}
void shell_sort(int *arr,int n)
{
int d[]={5,3,1};//d[]中保存的是增量
int len=sizeof(d)/sizeof(d[0]);
for(int i=0;i<len;++i)
{
shell(arr,n,d[i]);
}
}
void main()
{
int arr[]={65,34,25,87,12,38,56,46,14,77,92,23,55,62,42};
int len=sizeof(arr)/sizeof(arr[0]);
shell_sort(arr,len);
for(int i=0;i<len;++i)
{
cout<<arr[i]<<" ";
}
}