shell排序
分组进行多次插入排序
//时间复杂度O(n^1.3)~O(n^1.5),不稳定
//一趟shell过程,缩小增量排序,多次使用插入排序
void Shell(int *arr,int len,int 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)
{
int d[] = {5,3,1};
for(int i=0;i<sizeof(d)/sizeof(d[0]);i++)
{
Shell(arr,len,d[i]);
}
}
上面代码中分组示例为 5,3,1,有必要的话也可以分更大的组,相比插入排序而言缩小了时间复杂度,但是变的不稳定