排序算法之希尔排序(ShellSort)
希尔排序是插入排序的升级,又称为递减增量排序算法,是不稳定的排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
以23, 10, 4, 1的步长序列进行希尔排序。
最坏时间复杂度 | 根据步长序列的不同而不同。已知最好的: |
---|---|
最优时间复杂度 | O(n) |
平均时间复杂度 | 根据步长序列的不同而不同。 |
空间复杂度 |
#include<stdio.h>
#include<stdlib.h>
//定步长
//各组内插入排序
void ShellSort(int a[],int nlen)
{
int i,j,k,temp;
int nGap;
if(a==NULL ||nlen <=0) return ;
//定步长
for(nGap=nlen/2;nGap>=1;nGap/=2)
{
for(i=0;i<nGap;i++)
{
for(j=i+nGap;j<nlen;j+=nGap)
{
k=j-nGap;
temp=a[j];
while (a[k] > temp && k>=0)
{
a[k+nGap]=a[k];
k-=nGap;
}
a[k+nGap]=temp;
}
}
}
}
//-------------代码优化
void ShellSort2(int a[],int nlen)
{
int i,k,temp;
int nGap;
if(a==NULL || nlen <= 0) return ;
//定步长
for(nGap=nlen/2;nGap>=1;nGap/=2)
{
for(i=nGap;i<nlen;i++)
{
//插入排序
k=i-nGap; //有序数组最后一个
temp=a[i]; //无序数组最后一个
while (a[k]>temp && k>=0)
{
a[k+nGap] = a[k]; //有序数组后移
k-=nGap; //向前遍历
}
a[k+nGap]=temp;
}
}
}
int main()
{
int a[]={2,1,3,4,5,11,7,0,9};
int n = sizeof(a)/sizeof(a[0]);
int i=0;
ShellSort2(a,n);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
system("pause");
return 0;
}