插入排序和插入排序升级版(希尔排序)
先来初级版的插排;
我先给数组1---n赋值
a【0】当哨兵,当然可以不用哨兵,个人习惯
时间复杂度:
最好o(n)
最坏o(n*n)平均也是o(n*n)
稳定性好
void setup(int a[],int n)
{
for(int i=1;i<n;i++)
{
a[0]=a[i+1];
int j;
for(j=i;j>=0&&a[0]<a[j];j--)
a[j+1]=a[j];
a[j+1]=a[0];
}
}
n-1次排序
每次排i+1 和前面已经排好的来比较,按照升序来;
升级版本
对于局部有序或者基本有序的数列,最初的插入排序就略显呆滞,
希尔排序
每次分好组,第一次小组长度为d a【0】a【d】a【2d】为一组,a【1】a【d+1】a【2d+1】为二组,以此类推;
然后小组内部直接排序 但是稳定性差,会改变数的相对次序。、
void setup(int a[],int n)
{
int temp;
for(int d=n/2;d>0;d=d/2)
{
for(int i=d;i<n;i++)
{
temp=a[i];
int j;
for(j=i-d;j>=0&&temp<a[j];j=j-d)
{
a[j+d]=a[j];
}
a[j+d]=temp;
}
}
}