这里有图很清晰。https://blog.csdn.net/qq_39207948/article/details/80006224
直接插排适合用于小规模数据或者基本有序,但是这种数据不常见。更多的数据是 大规模而且无序。
希尔 将大数据集分割成若干个小组,然后对每一个小组分别进行插入排序,此时,插入排序的数据量小,插入效率高。
对各个组进行插入时不是对一个组排序后,再对另一个组排序,而是轮流对每个组进行插入排序。
希尔跳跃性,不稳定
#include<iostream>
using namespace std;
void show(int a[],int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}
int main()
{
int a[]={3,4,5,2,1};
int i,j,n=sizeof(a)/sizeof(a[0]);
//希尔排序
int gap=n/2; //最开始的增量为数组长度一半
for(;gap>0;gap/=2)
{
for(i=gap;i<n;i++)//对每个分组进行插入排序
{
int t=a[i];
for(j=i-gap;j>=0&&t<a[j];j-=gap)
{
a[j+gap]=a[j];
}
a[j+gap]=t;
}
}
//直接插入排序
for(i=1;i<n;i++)
{
int t=a[i];
for(j=i-1;j>=0&&t<a[j];j--)
{
a[j+1]=a[j];
}
a[j+1]=t;
}
show(a,n);
}