希尔排序的思想:先将整个待排序记录序列分割成为若干个子序列分别进行直接插入排序,带整个序列中的记录“基本有序”时再对全体记录进行一次直接插入排序。
一趟shell过程:
void Shell(int *arr,int len,int gap)//gap:分组
{
int tmp;
int i;
int j;
for(i=gap;i<len;i++)
{
tmp = arr[i];
for(j=i-gap;j>=0;j-=gap)
{
if(arr[j] <= tmp)
{
break;
}
else
{
arr[j+gap] = arr[j];
}
}
arr[j+gap] = tmp;
}
}
void ShellSort(int *arr,int len)//时间复杂度:O(n^1.3)~O(n^1.5),空间复杂度:O(1),不稳定
{
int d[] = {5,3,1};
for(int i=0;i<sizeof(d)/sizeof(d[0]);i++)
{
Shell(arr,len,d[i]);
}
}